星期的计算

星期的计算是能够计算出某一指定日期是在一周中的哪一天的一类算法。多种数学算法均可计算出过去或未来某一指定日期，是属于一周中的星期几，包括判决日法则（Doomsday Rule），Babwani公式等，但其实这些算法皆基于类似的机制相互变化而来，只是透过不同规则取得相同结果。
算法的典型应用，是计算某人的出生日期或某重大事件的发生日期，是在一周中的哪一天。
简介.
差不多所有星期算法的基础皆可归纳如下：
由以上可得知，使用同余7表示在计算中可剔除7的倍数，如此可把7当作0、8当作1、9当作2、18当作4，如此类推。如果把星期日当作第0日，7日后（第7日）亦是星期日，而第18日则会与第4日相同，为星期日后的4天，即星期四。一些算法把所有加数先行计算，然后把7的倍数剔除，而其他算法则在每一步皆剔除7的倍数。两种做法皆可取，第一种做法较适用于计算机及电脑算法中，其他则较适用于心算。熟悉这些计算方法之后，可在脑内计算出来。
简单的方法.
把四个数加起来然后同余7就是所求的星期数。这四个数分别是：
C：2(3-(c mod4))（格里历）、(4-c)mod7（儒略历）或查世纪星期表
Y：(y mod28+[y mod28/4])mod7（闰年1、2月份Y-1）或查年份星期表
M：((3.4+(m-3)mod12×2.6)mod7（1、2月份M-1）或查月份星期表
D：d mod7、或查日期星期表
就是说——W=(C+Y+M+D)mod7
(6+3+5+3)mod7=3，即该日是星期三，其中c=20、y=8、m=12、d=10
(6+2+3+3)mod7=0，即该日是星期日，其中c=20、y=8、m=2、d=10
(2+3+2+1)mod7=1，即该日是星期一，其中c=18、y=42、m=8、d=29
有用的概念.
同周月.
同周月是指那些第一天的星期数相同的月份。例如9月与12月是同周月，因为9月1日是星期几12月1日也必定是星期几。显然，只有两个月份之间相隔整数周，或恰好相隔7的倍数天时，这两个月才是同周月。比如在平年时，2月正好有28天，即2月与3月是同周月；而在闰年时，2月变成了29天，那么2月与3月就不是同周月了。下-{面}-是同周月的列表：
注意，5月与6月，不管是平年还是闰年，与其它任何月份都不是同周月。另外，在下-{面}-的月份查找表中，同周月由于开始于一周中的同一天，所以它们的数字（星期数）是相同的。
同周年.
同周年类似于同周月，是指那些第一天的星期数相同的年份。每一年的第一天都有星期一到星期日7种可能，而闰年的2月29日会改变其后日期的星期数。所以，每一年的星期构成共有14种可能。（教会用于计算复活节日期的主日字母即共有14种表示法）
例如2023年是以星期日开始的平年，与2017年、2006年及1995年为同周年，而2027年是以星期五开始的平年，与2021年、2010年及1999年为同周年。
2020年是以星期三开始的闰年，与2014年同样开始于星期三，但与2015年同样结束于星期四；2024年是以星期一开始的闰年，与2018年同样开始于星期一，但与2019年同样结束于星期二；而2032年是以星期四开始的闰年，与2026年同样开始于星期四，但与2027年同样结束于星期五。
算法.
以下算法适用于公历。需要注意的是，算法中世纪、年、月的星期数都是指的该世纪、年、月第0天为星期几，这样的好处是在计算时只要直接将天数加上就可以了，而不必再减1。例如，1900年的第0天（即1899年12月31日）是星期天，还要加上1才是1900年第1天（即1月1日）的星期数，即星期一。
另一个需要注意的是，算法中每一步得到的数字，都是参照特定日期得到的相对星期数，即与特定参照日相差几个星期数。只有把所有这些数字相加，再根据已知的参照日才得到实际的星期数。
算法的基本步骤如下：
将上面所有步骤的相对星期数相加，再取同余7就是实际的星期数了。
例子.
如我们要计算1982年4月24日是星期几：
又一个例子，1783年9月18日是星期几：
再一个例子，2054年6月19日是星期几：
世纪星期表.
 格里历
 1752-1799 4 c mod4=1
 1800-1899 2 c mod4=2
 1900-1999 0 c mod4=3
 2000-2099 6 c mod4=0
 2100-2199 4
 儒略历
 0800-0899 3 c mod7=1
 0900-0999 2 c mod7=2
 1000-1099 1 c mod7=3
 1100-1199 0 c mod7=4
 1200-1299 6 c mod7=5
 1300-1399 5 c mod7=6
 1400-1499 4 c mod7=0
 1500-1582 3
年份星期表.
 01 07 12 18 "24" 1
 02 "08" 13 19 24 2
 03 08 14 "20" 25 3
 "04" 09 15 20 26 4
 04 10 "16" 21 27 5
 05 11 16 22 "00" 6
 06 "12" 17 23 00 0
 闰年1、2月份年份y用斜体
月份星期表.
 01月 0 
 02月 3 
 03月 3 
 04月 6 
 05月 1 
 06月 4 
 07月 6 
 08月 2
 09月 5
 10月 0
 11月 3
 12月 5
日期星期表.
 星期一 1 01 08 15 22 29
 星期二 2 02 09 16 23 30
 星期三 3 03 10 17 24 31
 星期四 4 04 11 18 25
 星期五 5 05 12 19 26
 星期六 6 06 13 20 27
 星期天 0 07 14 21 28
表格法.
查星期：先找日和月的交叉数，然后在年（闰年1、2月份用斜体数字）行找到该数，对应到世纪行的数就是所求星期数。
查主日字母：世纪行“日”所在的列为主日字母世纪列，年份行对应到该列的数字就是该年的主日字母，一为A、二为B、三为C、四为D、五为E、六为F、日为G。
查判决日（Doomsday）星期数：年份行的“三”对应到世纪行的数就是Doomsday。
此外，主日字母（DL）和判决日（DD）存在着这样的关系：DL + DD = C（3）。如2013年的主日字母是F，那判决日的星期数DD = 3（C）- 6（F）mod 7 = 4（星期四）。
心算法.
心算时为方便记忆，一个简单的方法就是把一年的起始日想象成3月1日而不是1月1日（就像古罗马历一样），这样闰年的2月29日就变成了每年的最后一天，而不是在一年的中间。这样，计算星期时的标准第0日就变成了2月的最后一天。下-{面}-就会看到，这样计算时很方便记忆。
判决日.
这些日子在判决日法则中被称作判决日，与心算的过程类似，可帮助计算。
另一好处是1月和2月的计算也相对简单了，只要记住1月9日（或1月16日）和2月6日与上一年的判决日（2月最后一天）星期数相同就可以了。下-{面}-列出了每个月中便于记忆的判决日：
 月 +5 月 -5 月 +10 月
 4月4日 9月5日 2月6日
 6月6日 11月7日 
 8月8日 1月9日　 3月7日
 10月10日 　5月9日
 12月12日 　7月11日
所以只要确定每一年的第0日（2月最后一天）是星期几，参照上方列出的具有相同星期数的判决日，即可快速推算某天是星期几。
年数的计算.
确定每一年的第0日是星期几很简单：
例子.
比如我们要计算2017年6月3日是星期几。首先想到2000年第0日是星期二，那么12年后的2012年是星期三，2013年是星期四，2014年是星期五，2015年是星期六，2016年是星期一（因为是闰年），2017年第0日就是星期二。然后想到6月的判决日6月6日也是星期二，那么3天前的6月3日就是星期六。
高斯公式.
格里历：formula_1
儒略历：formula_2
例子.
计算2000年1月1日的星期，这一日期应视为1999年的11月1日。
计算2000年12月31日的星期，这一日期应视为该年的10月31日。
计算1777年4月30日的星期，这一日期应视为该年的2月30日。
计算1582年10月4日的星期，这一日期应视为该年的8月4日。
计算BC1（0）年1月1日的星期，这一日期应视为前一年的11月1日。
Babwani公式.
2004年11月，巴布瓦尼（Babwani）在伦敦数学学报（Mathematical Gazette）上发表了一种新的星期计算法。他的这种新方法相对于其它方法更简单，而且不仅可用于计算星期数，更可以在星期、日期、月份、年份中已知任意三者时，计算剩下的未知者。
公式：w = (⌊5y/4⌋ + m + d - 2(c mod 4) + 7) mod 7
 其中w=1=星期日
 c、y、和d=其它算法
 m=月份星期表
 ⌊5y/4⌋=其它公式的y+⌊y/4⌋
 -2(c mod 4)+7=1+6-2(c mod 4)=1+其它算法的2(3-(c mod 4)，所以1代表的不是星期一而是星期日。
蔡勒公式.
在蔡勒算法中，每一年被假设从3月开始，月份标号从3（3月）到14（二月），即1995年1月被认为是1994年13月。具体的算法是这样的：
其中w代表星期
c代表世纪数减1(年份前两位数)
y代表年（两位数）
m代表月（m大于等于3，小于等于14，即在蔡勒公式中，某年的1、2月要看作上一年的13、14月来计算，比如2003年1月1日要看作2002年的13月1日来计算）
d代表日
[ ]称作高斯符号，代表取整，即只要整数部份。
mod代表同余（这里代表括号里除以7后的余数）