日期的星期数

闰年?

被4整除,世纪数被4整除。闰年366天,2月29天。

y年m月d日,星期数?

用C 代表世纪数,0~6代表星期几。
为计算方便从3月1日开始计算,相当于把3月看成1月。现在y年m月d日变为Y年M月D日,有如下关系:
M=(m3)mod12+1
Y=ym/11
由于3651(mod7),3月1日的星期数每过一个平年+1,每过一个闰年+2,设1600年3月1日的星期数为w1600,y年3月1日(Y年3月1日)的星期数为wY,设y=Y=100C+X,从1600年到 Y 年要经过100C+X-1600年,星期数应加:
100C+X16002C+X3(mod7)
每4年有一个闰年,有
(100C+X1600)/4=25C+X/4400
个闰年,考虑到世纪年,应从这个数中减去C-16,再加(C16)/4=C/44。因此:
wYw1600+(2C+X+3)+(25C+X/4400)(C16)+(C/44)
w16002C+X+X/4+C/4(mod7)
已知2004年3月1日是星期一,代入上式,
1w16002×30+4+4/4+20/4w1600+5(mod7)
w1600=3,于是,得到
wY32C+X+X/4+C/4(mod7)
接下来计算从当年3月1日到每个月1号的天数,除每个月+30天外,3、5、7、8、10、12、1月有31天,应另外加的天数 z 如下表所示:

M 1 2 3 4 5 6 7 8 9 10 11 12
z 0 1 1 2 2 3 4 4 5 5 6 7

z 可表示成
z=\left{ \begin{array}{lcl} \lfloor M/2\rfloor      &      & {1 \leqslant M \leqslant 6}\ \lfloor (M+1)/2\rfloor    &      & {7 \leqslant M \leqslant 11}\ \lfloor (M+1)/2\rfloor +1    &      & {M=12}\ \end{array} \right.
=(M+M/7)/2+M/12
因此,M月d日应在 wY 上加
30(M1)+(M+M/7)/2+M/12+d1
=2M+(M+M/7)/2+M/12+d3(mod7)
最后将 (1)(2)两式合并,得到y年m月d日的星期数计算公式如下:
wX+X/4+C/42C+2M+(M+M/7)/2+M/12+d(mod7)
其中 M=(m3)mod12+1,Y=yM/11=100C+X
例如,中华人民共和国成立月1949年10月1日,C=19,X=49,M=8,d=1
w49+49/4+19/42×19+2×8+(8+8/7)/2+8/12+16(mod7)

参考资料

  1. 《离散数学》