[翻译]如何计算任意一天是星期几
看了一篇文章写的不错,正好有时间,就把文章翻译过来。
第一次翻译东西,可能不会太好,但,毕竟是第一次,有错误在所难免,希望通过更多这样的工作,逐渐的提高翻译的质量。
在训练自己的同时,有帮助了别人,何乐不为呢?
PDF下载地址:How To Calculate The Weekday For Any Date_CN.pdf
下面的公式可用来计算日历中任意一天为星期几:
世纪+年+月+日=星期几
式中的每个参数(世纪、年、月和日)通过一定计算得到相关的偏移量。而把这些偏移量相加便可得到表示该天是星期几的值。
为了得到正确的偏移量,让我们从最简单的情形开始讨论,也就是本世纪的第一年的第一月的第一天,既1900年1月1日,星期一。【注】
因为是20世纪,那我们把世纪=19时的偏移量设置为0。因此我们可以忽略这个世纪的偏移量,把主要精力放在处理年+月+日上。
为了尽可能的简化处理1900年1月1日的过程,我们把以00结尾的年的偏移量设置为0,同理设置第一月的参数为0。因此:
| 世纪(19) | + 年(00) | + 月(1) | + 日(1) | = 星期 | |
| 偏移量: | 0 | + 0 | + 0 | + 1 | = Monday |
因为当1900年1月的时候,世纪、年、月的偏移量都为0,所以我们现在暂时不考虑它们对结果的影响。因此我们只需要处理一月份天数在当月的偏移量转换。
日偏移量
由于一月份第一天是星期一,那我们就设星期一的值为1。而当月第二天紧随其后,为星期二,那我们设星期二的值为2.。依次便可得到当月前七天的取值,如下表所示:
| 星期 | 星期一 | 星期二 | 星期三 | 星期四 | 星期五 | 星期六 | 星期天 |
| 数值 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
【表】日偏移量
1月7号是第7天,而7表示星期日。那1月8号呢?在日历表中我们可以注意到,任何月的8号都和1号是同一星期,同样的还有15号、22号和29号。因此,如果我们让1月8号减去一个星期(也就是7天),我们便得到和1号一样的星期,既星期一。1月8号因此是星期一。
这种让8号、15号、22号、29号等减去一个星期以便得到一个小于或等于7的过程被称之为取模。而在计算机语言中一般用%来表示取模。20 % 7的值即为20除以7所得的余数。20 / 7 = 2 余6,既20 % 7 = 6.。因此20号和6号是同一星期。
但1月28日在 28 % 7 = 0。如何表示“星期零”呢?不错,那就是星期日。虽然我们之前设星期日的值为7,但 7 % 7 = 0,因此我们修改七天的取值,如下表所示:
| 星期 | 星期天 | 星期一 | 星期二 | 星期三 | 星期四 | 星期五 | 星期六 |
| 数值 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
【表】修改后的日偏移量
至此,我们已经可以计算出一月份任何一天为星期几。下面我们来计算月偏移量。
月偏移量
一月份是第一个月,因此我们设一月份的偏移量为0。一月份有31天,而31号是 31 % 7 = 3 = 星期三。当1月1号为星期一,那2月1号必为星期四。二月份的偏移量就等于:0(一月份偏移量)+ 31 % 7 = 3(一月份的“剩余天数”)。0 + 3 = 3。因此便知2月2号将会是3(二月份的月偏移量) + 2(日偏移量) = 5 (星期五)。
二月份有28天(非闰年情况下)。28 % 7 = 0。2月28号将会是 3(二月份的月偏移量) + 0 ( 28 % 7 )= 3 = 星期三。当2月1号为星期四,非闰年情况下3月1号必为星期四。同理,三月份的偏移量就等于 3(二月份的月偏移量)+ 28 % 7 = 0(二月份的“剩余天数”),既 3 + 0 = 3。因此也可知3月12号将会是3(三月份的月偏移量)+ 12(日偏移量) = 15 % 7 = 1(星期一)。
| 月份 | 偏移量 | 天数 | 天数%7 | 加入下月的偏移量 |
| 一月 | 0 | 31 | 3 | +3 |
| 二月 | 3 (0+3) | 28 | 0 | +0 |
| 三月 | 3 (3+0) | 31 | 3 | +3 |
| 四月 | 6 (3+3) | 30 | 2 | +2 |
| 五月 | 1 (6+2=8,%7) | 31 | 3 | +3 |
| 六月 | 4 (1+3) | 30 | 2 | +2 |
| 七月 | 6 (4+2) | 31 | 3 | +3 |
| 八月 | 2 (6+3=9, %7) | 31 | 3 | +3 |
| 九月 | 5 (2+3) | 30 | 2 | +2 |
| 十月 | 0 (5+2=7, %7) | 31 | 3 | +3 |
| 十一月 | 3 (0+3) | 30 | 2 | +2 |
| 十二月 | 5 (3+2) | 31 | 3 | +3 |
【表】月偏移量计算步骤
为便于计算相关星期,整理的月偏移量如下所示:
| 月份 | 一月 | 二月 | 三月 | 四月 | 五月 | 六月 | 七月 | 八月 | 九月 | 十月 | 十一月 | 十二月 |
| 偏移量 | 0 | 3 | 3 | 6 | 1 | 4 | 6 | 2 | 5 | 0 | 3 | 5 |
【表】12个月的月偏移量
年偏移量
十二月份的月偏移量是5,而十二月份有31天。31 % 7 = 3。5(十二月份的月偏移量) + 3(十二月份的“剩余天数”) = 8。8 % 7 = 1。既次年一月份便有了一个值为1的偏移量。因此,如果某年的1月1号为星期一,同时该年不是闰年,那么次年的1月1号便会为:365 % 7 = 1(次年的年偏移量) + 0(一月份的月偏移量)+ 1(日偏移量) = 2(星期二)。
如果某年的前一年不是闰年的话,那么该年的同一天将会比前一年晚一个“星期”。00年,既1900年被设定年偏移量为0。01年因此会被设定偏移量为1,02、03和04年也会被设定偏移量为2、3和4.。但在闰年的二月份将会有29天。我们为此将会给闰年多加1个年偏移量。当计算处在闰年一月份或者二月份的年偏移量时,我们必须从该年的年偏移量中减去1.,因为还没有到达闰日”。由于每4年才是闰年,因此年偏移量可以很快的通过 年 + 年 / 4获得。(记住当一个以00结尾的年并不一定是在公历中是闰年,除非它能被400整除)。
| 年份 | 偏移量 |
| 6, 17, 23, 28, 34, 45, 51, 56, 62, 73, 79, 84, 90 | 0 |
| 1, 7, 12, 18, 29, 35, 40, 46, 57, 63, 68, 74, 85, 91, 96 | 1 |
| 2, 13, 19, 24, 30, 41, 47, 52, 58, 69, 75, 80, 86, 97 | 2 |
| 3, 8, 14, 25, 31, 36, 42, 53, 59, 64, 70, 81, 87, 92, 98 | 3 |
| 9, 15, 20, 26, 37, 43, 48, 54, 65, 71, 76, 82, 93, 99 | 4 |
| 4, 10, 21, 27, 32, 38, 49, 55, 60, 66, 77, 83, 88, 94 | 5 |
| 5, 11, 16, 22, 33, 39, 44, 50, 61, 67, 72, 78, 89, 95 | 6 |
【表】年偏移量
现在来看一些例子:
1999年1月1日
| 世纪偏移量: | 0(19世纪) |
| 年偏移量: | 99 + 99/4 = 99 + 24 = 123.123%7 = 4 |
| 月偏移量: | 0(一月份) |
| 日偏移量: | 1 |
| 星期: | 0 + 4 + 0 + 1 = 5 = 星期五 |
因此,1999年1月1日是星期五。
1920年2月14日
| 世纪偏移量: | 0 |
| 年偏移量: | 20 + 20/4 -1 (该年为闰年,且闰日未到。) |
| 月偏移量: | 20 + 5 – 1 = 24. 24%7 = 3. |
| 日偏移量: | 3 |
| 星期: | 14. 14%7 = 0 |
| 0 + 3 + 3 + 0 = 6 = 星期六 |
因此,1920年2月14日是星期六。
世纪偏移量(现行公历 Gregorian Calendar)
每个世纪有100年,而100年共有100 + 100/4 = 125,既125%7 = 6个偏移量。这里计算时假设每个世纪中有25个闰年的情况在公历中仅针对可以被400整除的世纪,如400、800、1200、1600、2000年等。
因此,由于假设1900年的世纪偏移量为0,2000年的世纪偏移量即为6,比“上世纪”早一个“星期”。
因为每4个世纪中的其他3个世纪并没有25个闰年(00年并非闰年的情况),它们总的相对年偏移量为127%7 = 5。
1900年的世纪偏移量为0(由我们假定)。
2000年的世纪偏移量为0 + 6 = 6 ( 0 + 125%7)。
2100年的世纪偏移量为0 + 6 + 5 = 11%7 = 4 ( 0 + 6 + 124 % 7 )。
2200年的世纪偏移量为0 + 6 + 5 + 5 = 16 %7 = 2 ( 0 + 6 + 5 + 124%7)。
。。。
其实我们得到了一个0、6、4、2循环,同时每400年循环一回。
| 世纪 | 偏移量 |
| 300, 700, 1100, 1500,1900, 等 | 0 |
| 400, 800, 1200, 1600, 2000, 等. | 6 |
| 100, 500, 900, 1300, 1700, 等 | 4 |
| 200, 600, 1000, 1400, 1800, 等 | 2 |
【表】世纪偏移量(公历)
一个计算公历的世纪偏移量的捷径就是((39 – 世纪)%4)* 2。例如,1200(13世纪)的世纪偏移量为:((39 – 12)%4)* 2 = (27 % 4) * 2 = 3 * 2 = 6。在此选用39的原因是此时这个日历只在40世纪前有效,因此39即为下一个最大的4的倍数(40)减去1的值。
对任意给定的世纪求解其世纪偏移量的最快方法就是找到下一个最大的4的倍数,减去1,再减去该世纪,将该值乘上2即为最后结果。例如,查找1900(20世纪)的世纪偏移量的方法就是先找到先一个最大4的倍数,既20。然后通过((20 – 1) – 19) * 2 得到结果0,既0就是1900(20世纪)的世纪偏移量。查找2000(21世纪)的世纪偏移量的方法也大同小异,找到大于20的下一个最大4的倍数24,然后((24 – 1) – 20 ) * 2 = 6。查找7400(75世纪)的世纪偏移量,找到大于74的下一个最大4的倍数76,通过((76 -1 ) – 74 )* 2 = 2。
我们现在已经掌握了求公历的任意一天为星期几的所有方法。如果我们可以记住12个月偏移量,那我们就可以很快的通过心算或者用一张纸计算出结果。
针对公历中一些日期计算的举例:
1776年7月4日
| 世纪偏移量: | ((20-1)-17)*2 = 4 |
| 年偏移量: | 76 + 76/4 = 76 + 19 = 95. 95%7 = 4 |
| 月偏移量: | 6(七月份的月偏移量) |
| 日偏移量: | 4 |
| 星期: | 4 + 4 + 6 + 4 = 18. 18 % 7 = 4 = 星期四 |
因此,1776年7月4日是星期四(公历)。
2020年2月14日
| 世纪偏移量: | (((24-1)-20)*2 = 6 |
| 年偏移量: | 20 + 20/4 = 20 + 5 = 25. 25%7 = 4 |
| (因为是闰年的1、2月份,减去1) 4 – 1 = 3 | |
| 月偏移量: | 3(二月份的月偏移量) |
| 日偏移量: | 14. 14 % 7 = 0 |
| 星期: | 6 + 3 + 3 + 0 = 12. 12 % 7 = 5 = 星期五 |
2020年2月14日是星期五(公历)。
世纪偏移量(儒略历 Julian Calendar)
针对儒略历的星期几计算与针对现行公历十分相似。这里有两点区别,第一点区别就是以00结尾的年份都是闰年。因此像1700、1800、和1900年都是闰年。
另外一个却别就是每个世纪都有100年共100/4 = 25个润年年。相对应的儒略历世纪偏移量总是6,既 125 % 7 = 6。
对于儒略历来说,每个世纪都比之前的世纪早“1天”,不像在现行公历中那样会每四个世纪有个例外。
对于儒略历来说,1900(20世纪)的世纪偏移量为6,1800(19世纪)的世纪偏移量0,1700(18世纪)的世纪偏移量为1,等等。
从这种趋势总可以观察到两个事实。一个是随着世纪增加,世纪偏移量会较少。另一个是1800(19世纪)的世纪偏移量为0,同时由于 18 % 7 = 4,则必须添加3到该“世纪”使得4 + 3 = 7 同时 7 % 7 = 0。
因此,一个快速计算儒略历世纪偏移量的方法就是添加3到“世纪”上,再与7求模(这两步以0为基准校准所得值),然后再让7减去(用来使偏移量减少,当“世纪”增加的时候):即,7 – (世纪 + 3 ) % 7。
于是,1900(20世纪)的世纪偏移量为 7 – ( 19 + 3 ) % 7 = 7 – 1 = 6。1800(19世纪)的世纪偏移量为 7- ( 18 + 3 ) % 7 = 7 – 0 = 7,即 7 % 7 = 0。1000(11世纪)的世纪偏移量为 7 – ( 10 + 3 ) % 7 = 7 – 6 = 1。
那么循环即为:6、5、4、3、2、1、0,同时每700年循环一回。
| 世纪 | 偏移量 |
| 500, 1200, 1900, 等 | 6 |
| 600, 1300, 2000, 等 | 5 |
| 00, 700, 1400, 等 | 4 |
| 100, 800, 1500, 等 | 3 |
| 200, 900, 1600, 等 | 2 |
| 300, 1000, 1700, 等 | 1 |
| 400, 1100, 1800, 等 | 0 |
我们现在已经掌握了计算儒略历的任意一天星期几的所有方法。如果我们能够记住12个月偏移量,那么我们也就可以很快速的通过心算或者用一张纸计算出结果。
针对儒略历的一些日期计算举例:
1776年7月4日:
| 世纪偏移量: | 7 – (17 + 3) % 7 = 1 |
| 年偏移量: | 76 + 76/4 = 76 + 19 = 95. 95%7 = 4 |
| 月偏移量: | 6(七月份的月偏移量) |
| 日偏移量: | 4 |
| 星期: | 1 + 4 + 6 + 4 = 15. 15 % 7 = 1 = 星期一 |
1776年7月4日是星期一(儒略历)
2020年2月14日:
| 世纪偏移量: | 7 – (20 + 3) % 7 = 5 |
| 年偏移量: | 20 + 20/4 = 20 + 5 = 25. 25%7 = 4 |
| (由于是闰年的1、2月,减去1) 4 – 1 = 3 | |
| 月偏移量: | 3(二月份的月偏移量) |
| 日偏移量: | 14. 14 % 7 = 0 |
| 星期: | 5 + 3 + 3 + 0 = 11. 11 % 7 = 4 = 星期四 |
2020年2月14日是星期四(儒略历)
总结
计算日历中任意一天是星期几的算法出奇的简单。简单的以至于熟记12个月偏移量后就可以心算或者用纸算出来。
就像这个程序展现出来的那样,此算法是如此简单的就可以计算出来相应的结果。
文章地址:http://meiyou.org/2009/12/how-to-calculate-the-weekday-for-any-date/
暂无留言我要留言 »
请 登陆 评论