地球绕太阳一圈,实际需要约 365.2422 天。如果日历死板地一年 365 天,每过一年就会比天文位置差约 0.24 天,四百年下来能差出快一百天——到时候 6 月会变成冬天,节气全乱。
解决办法是加闰日:每四年在 2 月末尾多一天,把 0.2422 天攒起来的误差抹掉。但 0.2422 和 0.25 还差一点,四年加一天反而多加了,所以又补了两条修正规则:
规则:年份能被 4 整除的是闰年;但能被 100 整除的除外;不过能被 400 整除的又算闰年。口诀就是「四年一闰,百年不闰,四百年再闰」。
三个例子对一下:2024 能被 4 整除且不能被 100 整除 → 闰年(2 月有 29 天,去年就刚过);1900 能被 100 整除但不能被 400 整除 → 不是闰年;2000 能被 400 整除 → 是闰年。2000 年那年很多人在跨世纪时争论过这个,答案是闰。
这套规则在 1582 年由格里高利历定下来,中国 1912 年改用公历后也沿用。我们现在手机日历里的 2 月 29 日,就是这个规则的产物。
对写程序的人,有个具体坑:判断闰年不能只写「能被 4 整除」,否则 1900 年会被判错;new Date(2023, 1, 29) 这类构造会自动滚到 3 月 1 日,不会报错,但结果不是你要的。
实用建议:需要判断闰年时直接套完整公式「(y % 4 === 0 && y % 100 !== 0) || y % 400 === 0」,别精简。