日期的星期数

闰年?

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

y年m月d日,星期数?

用C 代表世纪数,0~6代表星期几。
为计算方便从3月1日开始计算,相当于把3月看成1月。现在y年m月d日变为Y年M月D日,有如下关系:
$$M=(m-3)mod12+1$$
$$Y=y-\lfloor m/11 \rfloor$$
由于$365\equiv 1(mod7)$,3月1日的星期数每过一个平年+1,每过一个闰年+2,设1600年3月1日的星期数为$w_{1600}$,y年3月1日(Y年3月1日)的星期数为$w_{Y}$,设y=Y=100C+X,从1600年到 Y 年要经过100C+X-1600年,星期数应加:
$$100C+X-1600\equiv 2C+X-3(mod 7)$$
每4年有一个闰年,有
$$\lfloor(100C+X-1600)/4\rfloor=25C+ \lfloor X/4\rfloor-400$$
个闰年,考虑到世纪年,应从这个数中减去C-16,再加$\lfloor (C-16)/4\rfloor= \lfloor C/4\rfloor-4$。因此:
$$w_Y\equiv w_{1600}+(2C+X+3)+(25C+\lfloor X/4\rfloor-400)-(C-16)+(\lfloor C/4\rfloor-4)$$
$$\equiv w_{1600}-2C+X +\lfloor X/4\rfloor +\lfloor C/4\rfloor(mod7)$$
已知2004年3月1日是星期一,代入上式,
$$1\equiv w_{1600}-2\times30+4+\lfloor 4/4\rfloor+\lfloor 20/4\rfloor\equiv w_{1600}+5(mod7)$$
得$w_{1600}=3$,于是,得到
$$w_Y\equiv 3-2C +X+\lfloor X/4\rfloor+\lfloor C/4\rfloor(mod7) \tag{1}$$
接下来计算从当年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.$$
$$ =\lfloor (M+\lfloor M/7\rfloor)/2\rfloor+\lfloor M/12\rfloor $$
因此,M月d日应在 $w_Y$ 上加
$$30(M-1)+\lfloor (M+\lfloor M/7 \rfloor)/2\rfloor +\lfloor M/12 \rfloor+d-1$$
$$=2M+\lfloor (M+\lfloor M/7 \rfloor)/2\rfloor+\lfloor M/12 \rfloor+d-3(mod 7) \tag{2}$$
最后将 (1)(2)两式合并,得到y年m月d日的星期数计算公式如下:
$$w\equiv X+\lfloor X/4\rfloor+\lfloor C/4\rfloor-2C+2M+\lfloor (M+\lfloor M/7 \rfloor)/2\rfloor+\lfloor M/12 \rfloor+d(mod7)$$
其中 $M=(m-3)mod12+1,Y=y-\lfloor M/11\rfloor=100C+X$
例如,中华人民共和国成立月1949年10月1日,C=19,X=49,M=8,d=1
$$w\equiv 49+\lfloor 49/4\rfloor+\lfloor 19/4\rfloor-2 \times19+2 \times 8+\lfloor (8+\lfloor 8/7\rfloor)/2\rfloor +\lfloor 8/12\rfloor+1 \equiv 6(mod7)$$

参考资料

  1. 《离散数学》