昨天我写了一篇帖子,概述了我这些年来写过的心算文章。我平时不怎么写心算,但我已经写了很长时间了,所以文章也积累了不少。在写这篇概述的过程中,我注意到了一个小小的空白。
在关于心算星期几的文章中,我重点介绍了本世纪的情况,然后简洁地写道:“20世纪的日期加1,22世纪的日期减2。” 这篇文章将对此进行扩展。我将更详细地解释这些规则的含义、如何将它们扩展到其他世纪,以及它们为何有效。
20世纪的日期
假设你想知道1976年7月4日是星期几。你可以使用上面链接的帖子中的方法,最终得到星期六。再向前移动一天,就会得到星期日。
未来世纪的日期
对于 2100 年代的日期,您需要找到该世纪对应日期的星期几,然后减去两天。对于 2200 年代的日期,您需要加上三天;对于 2300 年代的日期,您需要加上一天。
公历每400年重复一次,所以如果你能找到2000年到2399年的星期几,就能找到未来所有年份的星期几,只需减去足够多的400的倍数,就能得到这个范围的年份。例如,公元2825年的9月18日是星期四,因为2025年的今天是星期四。
你也可以向前或向后追溯几个世纪,但这有一个复杂之处。如果你把公历往前追溯得足够远,你就会遇到公历被采用之前的时代。
规则为何有效
那么,世纪调整规则为何有效呢?有一个简单但不完整的解释,还有一个更复杂的完整解释。
部分解释
大多数世纪的天数,即不能被 400 整除的天数,是
365 × 100 + 24 = 36524
与 5 mod 7 一致,后者与 −2 mod 7 一致。2100 年代的日期比 2000 年代的日期早 36524 天,因此一周要往后调两天。从 2100 年代到 2200 年代,以及从 2200 年代到 2300 年代,情况也是如此。
例如,2125 年 9 月 18 日距今还有 36524 天(请注意,2100 年 2 月没有闰日),因此它将是该周的提前两天,即星期二。
这个解释基本正确,但有一个问题。2100 年代的日期并非都比 2000 年代的日期提前 36524 天。2025 年 9 月 18 日到 2125 年 9 月 18 日之间确实有 3652 个4天。但 2000 年 1 月 1 日到 2100 年 1 月 1 日之间有 3652 个5天。前者是星期六,后者是星期五。看起来我们的计算过程是错误的,但事实并非如此。
完整解释
让我们回过头来看看查找星期几的算法,
- 取年份的最后两位数字,并加上 4 除以该数字的倍数 [1]。
- 添加与月份对应的常数。
- 添加月份中的日期。
- 闰年的一月或二月减 1。
- 取余数除以 7。
- 适应本世纪。
假设我们想要找到 2100 年 1 月 1 日是星期几。第一步得到的结果为 0。1 月份的常数为 6,因此在第二步结束时我们得到 6。第三步结束时我们得到 7。
现在到了关键部分:在第4步中,我们没有减1,因为2100年不是闰年。第5步的结果为0,也就是星期日。当我们根据世纪数往后推两天后,就得到了星期五。
这个解释确实很冗长,但它揭示了算法的一个微妙之处:你必须对原始年份执行该算法,特别是步骤4。例如,要查找2200年代某一年的星期几,你必须按照2200年代有效的算法执行该算法,直到最后一步。
相关文章
[1] 这被称为年份额。有很多计算方法(mod 7),这些方法不太明显,但更容易心算。有趣的是,这些方法通常看起来更复杂,但执行起来却更容易。
几个世纪后的一周中的某一天一文最先出现在John D. Cook 的文章中。
原文: https://www.johndcook.com/blog/2025/09/18/day-of-the-week-centuries-from-now/