吉普2020
回答者
回答于 2026-11-08
通过蔡勒公式(Zeller's congruence)可以推算历史上任意公历日期对应的星期几。
公式
$$h = \left( q + \left\lfloor \frac{13(m+1)}{5} \right\rfloor + K + \left\lfloor \frac{K}{4} \right\rfloor + \left\lfloor \frac{J}{4} \right\rfloor - 2J \right) \mod 7$$
变量定义与步骤
- q:日期中的日数。
- m:月份。关键规则:将1月和2月分别视为上一年的13月和14月。例如2024年1月需按2023年13月计算。
- K:年份的后两位数(即 year mod 100)。若月份为13或14,则年份减1后再取后两位。
- J:年份的前两位数(即世纪数,year / 100 取整)。
- h:计算结果,对应星期几:0=星期六,1=星期日,2=星期一,3=星期二,4=星期三,5=星期四,6=星期五。
判断依据
公式中各项的含义:
- $q$ 贡献日数的偏移。
- $\lfloor 13(m+1)/5 \rfloor$ 近似表达各月天数累积对星期的影响。
- $K$ 和 $\lfloor K/4 \rfloor$ 处理平年与闰年中每年多出的天数及闰年补偿。
- $\lfloor J/4 \rfloor - 2J$ 处理世纪级别的闰年修正(格里高利历每400年97个闰年)。
适用条件
- 仅适用于格里高利历(现行公历),即1582年10月15日之后的日期。对于此日期之前仍使用儒略历的地区,需改用儒略历版本的蔡勒公式(将 $-2J$ 替换为 $+5J$ 并调整常数)。
- 计算结果为负数时,取模运算应保证余数为非负整数(即加上7再取模)。
常见误区
- 未调整1月和2月:直接代入 m=1 或 m=2 会导致结果错误,必须将其转换为上一年的13月或14月。
- 混淆历法:对1582年之前的历史日期直接使用格里高利历公式,忽略了当时实际使用的是儒略历,各国切换历法的时间也不统一。
- 取模方向:部分编程语言中负数取模结果为负,需手动加7调整为正余数以正确映射星期。