Gauss 公式(或称 Gauss 算法)是一种用于日期计算的经典数学方法,主要用于将一个给定的天数(从某个固定日期开始计算的天数)转换为具体的年、月、日。
Gauss 公式的核心思想是基于闰年规则 和天数累积规律 ,通过数学公式直接计算出某一天对应的年份、月份和日期,而不需要逐天遍历或使用复杂的循环
在公历(格里高利历)中:
- 一年通常是 365 天。
- 每 4 年有一个闰年(366 天),但每 100 年不设闰年,每 400 年又恢复闰年。
这些规则使得公历的天数分布具有一定的周期性,可以通过数学公式快速计算。
闰年的规则是公历(格里高利历)中为了调整日历年与地球公转周期(约 365.2425 天)之间的差异而制定的。具体规则如下:
- 每 4 年一个闰年 :通常情况下,能被 4 整除的年份是闰年。
- 每 100 年不设闰年 :能被 100 整除的年份不是闰年,即使它能被 4 整除。
- 每 400 年恢复闰年 :能被 400 整除的年份仍然是闰年。
举例说明
(1) 普通闰年
- 2004 年 :
- 能被 4 整除(2004 ÷ 4 = 501,余数为 0)。
- 不是 100 的倍数。
- 因此,2004 年是闰年,有 366 天。
(2) 非闰年(100 年规则)
- 1900 年 :
- 能被 4 整除(1900 ÷ 4 = 475,余数为 0)。
- 但它是 100 的倍数(1900 ÷ 100 = 19,余数为 0)。
- 因此,1900 年不是闰年,只有 365 天。
(3) 特殊闰年(400 年规则)
- 2000 年 :
- 能被 4 整除(2000 ÷ 4 = 500,余数为 0)。
- 是 100 的倍数(2000 ÷ 100 = 20,余数为 0)。
- 但它也是 400 的倍数(2000 ÷ 400 = 5,余数为 0)。
- 因此,2000 年是闰年,有 366 天。
为什么需要这些规则?
(1) 地球公转周期
地球绕太阳一周的时间约为 365.2425 天 ,而不是整数天。
如果每年都按 365 天计算,每年会少约 0.2425 天。
经过 4 年,累积的误差约为 0.97 天(接近 1 天)。
因此,引入闰年规则来补偿这个误差。
(2) 修正误差
![]()
Gauss 公式的基本形式
假设我们有一个天数
days
,表示从某个基准日期(如公元前 1 年 3 月 1 日)开始的总天数,Gauss 公式可以用来计算对应的年份、月份和日期。(1) 计算年份
year = (days + 2) * 400 / (365 * 400 + 100 - 4 + 1);
- 这里的
(365 * 400 + 100 - 4 + 1)
是 400 年中的总天数:
- 400 年中有 365 × 400 = 146000 天。
- 加上 97 个闰年(400 ÷ 4 - 400 ÷ 100 + 400 ÷ 400 = 97)。
- 总天数为 146097。
(days + 2)
是为了调整天数的偏移量,确保计算结果正确。
(days + 2) ?
分子
(days + 2)
是为了调整天数的起始点,使得计算结果更接近实际的年份如果不加偏移量(即直接用
days
),可能会导致某些年份的边界值计算错误。例如,当days
刚好对应某一年的第一天时,直接计算可能会将年份误判为上一年
+2
是一个经验值,经过多次测试和验证得出的。它的具体值与公历的日期分布规律有关,尤其是 3 月 1 日作为基准日期的特殊性。
通过加上
2
,可以确保计算结果在所有可能的输入范围内都正
(2) 计算一年中的第几天
yday = days - (365 * year + year / 4 - year / 100 + year / 400);
365 * year
是普通年份的天数。year / 4
是闰年的天数(每 4 年一个闰年)。year / 100
是排除的非闰年(每 100 年不设闰年)。year / 400
是恢复的闰年(每 400 年恢复闰年)。yday
表示当前年份中的第几天。