星期是以 7 天为周期的循环,某日期是星期几,只取决于它与一个已知锚点相隔的整数天数对 7 取余:
星期偏移 =(目标日期 − 锚点日期)的整数天数 mod 7
例如取 2000 年 1 月 1 日为锚点(那天是星期六),把目标日期与锚点相差的天数除以 7 取余, 即可得到星期几。本工具用公历(格里高利历)按 UTC 做整数天运算,闰年规则为 「四年一闰、百年不闰、四百年再闰」,自动处理 2 月 29 日,无时区误差。
蔡勒(Zeller)公式是手算星期几的经典方法,把 1、2 月看作上一年的 13、14 月后代入:
W =(d + ⌊13(m+1)/5⌋ + q + ⌊q/4⌋ + ⌊c/4⌋ − 2c)mod 7其中 d 为日,m 为月(1、2 月按 13、14 计,年份 −1),q 为年份后两位,c 为年份前两位(世纪), 结果 W:0=星期六、1=星期日、2=星期一……6=星期五。
计算示例以 2000-01-01 为例:按蔡勒公式,1 月视作前一年(1999)的 13 月,故 m=13、q=99、c=19、d=1,W =(1 + ⌊13×14/5⌋ + 99 + ⌊99/4⌋ + ⌊19/4⌋ − 2×19)mod 7 =(1 + 36 + 99 + 24 + 4 − 38)mod 7 = 126 mod 7 = 0,W=0 即星期六,与万年历一致。
同一月日在各年份的星期:平年 365 = 52×7 + 1,所以同一个月日次年通常后移 1 个星期几; 若两年之间跨过 2 月 29 日,则后移 2 个星期几。这就是生日每隔几年才又落回同一个星期几的原因。
刚毛的意思
深宫锁情缘