星期的計算
维基百科,自由的百科全书
星期的計算是以數學方法計算出某一指定日期是在一周中的哪一天。多種數學算法可計算出過去或未來某一指定日期,是屬於一周中的星期幾,包括判决日法则(Doomsday Rule),Babwani公式等,但其實這些算法皆基于类似的机制相互变化而来,只是透過不同規則取得相同結果。
算法的典型應用,是計算某人的出生日期或某重大事件的發生日期,是在一周中的哪一天。
目录 |
[编辑] 簡介
差不多所有星期算法的基礎皆可歸納如下:
- 从一個已知的日子作为起始日,一般采用世纪的第一天,通过同余7计算共过去了多少天。如將一周日子由0至6計算,結果將為一餘數,如使用1至7計算,則7將代替0。
- 查表或使用已知规则计算上面的起始日,即該世紀开始的星期数。
- 查表或使用已知规则計算該年份開始的星期数。
- 計算該月份開始的星期数。
- 从該月份開始的计算该日的星期数。
簡單來說,使用同餘7表示在計算中可剔除7的倍數,如此可把7當作0、8當作1、9當作2、18當作4,如此類推。如果把星期日當作第0日,7日後(第7日)亦是星期日,而第18日則會與第4日相同,為星期日後的4天,即星期四。一些算法把所有加數先行計算,然後把7的倍數剔除,而其他算法則在每一步皆剔除7的倍數。兩種做法皆可取,第一種做法較適用於計算機及電腦算法中,其他則較適用於心算。這些計算在熟習後,可在腦內計算出來。
[编辑] 有用的概念
[编辑] 同周月
同周月是指那些第一天的星期数相同的月份。例如9月与12月是同周月,因为9月1日是星期几12月1日也必定是星期几。显然,只有两个月份之间相隔整数周,或恰好相隔7的倍数天时,这两个月才是同周月。比如在平年时,2月正好有28天,即2月与3月是同周月;而在闰年时,2月变成了29天,那么2月与3月就不是同周月了。下面是同周月的列表:
- 平年:1月 与 10月
- 闰年:1月,4月,7月
- 平年:2月,3月,11月
- 闰年:2月 与 8月
- 9月 与 12月 (平年、闰年都是)
注意,5月与6月,不管是平年还是闰年,与其它任何月份都不是同周月。另外,在下面的月份查找表中,同周月由于开始于一周中的同一天,所以它们的数字(星期数)是相同的。
[编辑] 同周年
同周年类似于同周月,是指那些第一天的星期数相同的年份。每一年的第一天都有星期一到星期日7种可能,而闰年的2月29日会改变其后日期的星期数。所以,每一年的星期构成共有14种可能。(教会用于计算复活节日期的主日文字即共有14种表示法)
例如2003年是以星期三开始的平年,与1997年为同周年;2004年是以星期四开始的闰年,与1998年同杨开始与星期四,但与1999年同样结束于星期五。
[编辑] 算法
下面介绍的算法适用于公历。需要注意的是,算法中世纪、年、月的星期数都是指的该世纪、年、月第0天为星期几,这样的好处是在计算时只要直接将天数加上就可以了,而不必再减1。例如,我们说1900年的第0天是星期天,也就是还要加上1才是1900年第1天(即1月1日)的星期数,即星期一。
另一个需要注意的是,算法中每一步得到的数字,都是参照特定日期得到的相对星期数,即与特定参照日相差几个星期数。只有把所有这些数字相加,再根据已知的参照日才得到实际的星期数。下面的表格及计算规则都是采用1900年1月1日为参照日,由于正好是星期天(星期数为0),相对于0的相对星期数就等于实际星期数。这样我们就可以节省掉最后参照的一步,所有的数字总和取同余就是实际的星期数了。
算法的基本步骤是这样的:
- 计算世纪的相对星期数,即所要计算的世纪第0天与1900年第0天相差多少。一种办法是在下面的表格中直接查找;另一种办法是使用下面的规则来计算:将世纪数除以4,用3 减去所得的余数,再将所得数字乘以2。需要注意的是这里的世纪数是实际年数的前两位,而不是我们通常所说的十九、二十世纪。
- 例如对于1800-1899年,我们取世纪数为18(而不是19世纪),18/4余2,然后用3减2得1,最后1乘以2得到2。即1800年第0日为星期二。
- 计算该年的相对星期数,即所要计算的该年第0天与该世纪第0天相差多少。每一平年有365天,即52个星期加1天,也就是说下一年的起始星期数是当前年起始星期数加1;如果是闰年那么还要额外加1天。这样我们如果知道该世纪开始的星期数,那么只要每过一年起始星期数加1,如果是闰年就再额外加1,这样就可以得出该世纪中任何一年的相对星期数。
- 例如1978年,参照1900年过去了78年,那么对于每一个平年都要加1,而这78年间共有78/4=19个闰年(这里的余数可以互略,因为余出的两年绝不会是闰年),还要再加19。那么1978年的起始星期数就是:1900年的起始星期数0+78+19=97,再取同余7之后,相当于6。
- 另一种计算方法是把上面的78年除以12,先将所得的商数与余数相加;然后用余数再除以4,所得商数也加入刚才的结果。也就是78/12得到商数为6,余数为6,两者相加得12;然后刚才的余数6/4得到商数1,那么最后的结果就是12+1=13,取同余7之后,相当于6。
- 计算该月的相对星期数,即所要计算的月份的第0天与该年第0天相差多少。我们参照下面的月份表可以得到每个月起始日的相对星期数。显然1月的星期数为0,因为1月的第0天也是作为参照日的该年的第0天。下面的表格同时列出了闰年时的特殊情况,有些算法把闰年放到最后一步再考虑,即如果所要计算的日期是闰年的1月或2月,将所得数字减1。两种方法都可以,只要不重复计算即可。
- 计算该日的星期数,即所要计算的日期与该月第0天相差多少。显然这个数字就是该日的日期数,如1月22日相对于1月第0天过去了22天,得到22,取同余7之后,相当于1。
将上面所有步骤的相对星期数相加,即得到所要计算的日期相对于1900年第0天的相对星期数,由于1900年第0天正好是星期天(星期数为0),那么只要简单地把这个总和取同余7就是实际的星期数了。
[编辑] 例子
如我们要计算1982年4月24日是星期几:
- 在世纪表格中查到1900所在世纪对应数字:0
- 该年数为:82 (即82个平年)
- 82除以4,82/4=20.5,取整数部分:20 (即有20个闰年)
- 在月份表格中查到4月对应数字:6
- 将上面所得数字与日期数24相加:0+82+20+6+24=132
- 对132取同余7,即132/7=18余6
- 在日期表中得到:6即星期六
又一个例子,1783年9月18日是星期几:
- 在世纪表格中查到1700所在世纪对应数字:4
- 该年数为:83 (即83个平年)
- 83除以4,83/4=20.75,取整数部分:20 (即有20个闰年)
- 在月份表格中查到9月对应数字:5
- 将上面所得数字与日期数18相加:4+83+20+5+18=130
- 对130取同余7,即130/7=18余4
- 在日期表中得到:4即星期四
再一个例子,2054年6月19日是星期几:
- 在世纪表格中查到2000所在世纪为:6
- 该年数为:54 (即54个平年)
- 54除以4,54/4=13.5,取整数部分:13 (即有13个闰年)
- 在月份表格中查到6月对应数字:4
- 将上面所得数字与日期数19相加:6+54+13+4+19=96
- 对96取同余7,即96/7=13余5
- 在日期表中得到:5即星期五
[编辑] 世纪星期表
1752-1799 4 1800-1899 2 1900-1999 0 2000-2099 6 2100-2199 4
[编辑] 月份星期表
一月 0 (闰年为 6) 二月 3 (闰年为 2) 三月 3 四月 6 五月 1 六月 4 七月 6 八月 2 九月 5 十月 0 十一月 3 十二月 5
[编辑] 星期表
星期天 0 星期一 1 星期二 2 星期三 3 星期四 4 星期五 5 星期六 6
[编辑] 心算法
心算时为方便记忆,一个简单的方法就是把一年的起始日想象成3月1日而不是1月1日(就像古罗马历一样),这样闰年的2月29日就变成了每年的最后一天,而不是在一年的中间。这样,计算星期时的标准第0日就变成了2月的最后一天。下面就会看到,这样计算时很方便记忆。
[编辑] 判决日
- 4月4日,6月6日,8月8日,10月10日,12月12日都与第0日(2月最后一天)的星期数相同。
- 5月9日,9月5日也与第0日相同。(想象我们上班早九晚五就可以记住了)。
- 7月11日,11月7日也与第0日相同。(想象便利店7-Eleven可以帮助记忆)。
这些日子在判决日法则中被称作判决日,跟我们心算的过程类似,用以帮助计算。
另外一个好处是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日是星期几很简单:
- 首先记住2000年第0日(2月最后一天)是星期二。每100年的第0日的星期数按下面规律变化:星期二(Tuesday),星期日(Sunday),星期五(Friday),星期三(Wednesday),星期二(Tuesday),星期日(Sunday),星期五(Friday),星期三(Wednesday)……如此循环往复。(一个帮助记忆的方法就是取英文字的首字母(T.S.F.W),将它们组成一句话:Too Sunny For Walk)按此规律,2100年第0日是星期日,1900年是星期三。
- 此外,每过一个平年,第0日的星期数加1,每过一个闰年,第0日的星期数加2。这样每过12年,第0日的星期数就加1。比如2000年是星期二,2012年就是星期三,2024年就是星期四。另外一个值得记住的是,每相隔28年,只要相隔的两年在一个世纪内,或者跨过2000年,那么它们的第0日都在一个星期。(比如1972年与2028年是一样的。)
[编辑] 例子
比如我们要计算2017年6月3日是星期几。首先想到2000年第0日是星期二,那么12年后的2012年是星期三,2013年是星期四,2014年是星期五,2015年是星期六,2016年是星期一(因为是闰年),2017年第0日就是星期二。然后想到6月的判决日6月6日也是星期二,那么3天前的6月3日就是星期六。
[编辑] Babwani公式
2004年11月,巴布瓦尼(Babwani)在伦敦数学学报(Mathematical Gazette)上发表了一种新的星期计算法。他的这种新方法相对于其它方法更简单,而且不仅可用于计算星期数,更可以在星期、日期、月份、年份中已知任意三者时,计算剩下的未知者。
在蔡勒算法中,每一年被假设从3月开始,月份标号从3(3月)到14(二月),即1995年1月被认为是1994年13月。在巴布瓦尼的算法中,无需作此假定,月份标号还是从1(1月)到12(12月),更符合日常习惯。具体的算法可以参见这个英文站点:http://www.geocities.com/sohaelbabwani/algorithm.html
[编辑] 主日字母
每一年的星期数也可以根据主日字母确定。基督教教历上常用A-G七个字母来标示某一年的星期日(主日)是在第几天,如1月3日为星期日,那么该年的主日字母就是C。该年的主日字母确定了,那么每一天就按顺序被分配给相应的字母。此一方法据说最早古罗马人就有使用,后来常用于基督教上确定复活节日期的一种计算办法。在这一系统中,闰年的2月29日没有主日字母,这就使得2月29日之后的星期日与此前的星期日的主日字母不一致,所以闰年的主日字母都有两个。