偶然了解到的闰年小知识
今天在查阅教程的过程中,教授偶然了解到一些闰年的小知识,记录一下。
起因
假期在看《Python - 100天从新手到大师》的过程中,看到一个习题里面有关于闰年判断的示例:
"""
输入年份 如果是闰年输出True 否则输出False
Version: 0.1
Author: 骆昊
"""
year = int(input('请输入年份: '))
# 如果代码太长写成一行不便于阅读 可以使用\对代码进行折行
is_leap = year % 4 == 0 and year % 100 != 0 or \
year % 400 == 0
print(is_leap)
虽然代码的逻辑很清晰,不过却很疑惑,如果按照这个写法作判断的话,闰年的起点似乎应该是公元 0 年。于是便简单查阅了一下闰年的相关知识,果然还是发现有一些自己以前从未注意过的细节。
闰年定义
从维基百科了解到的闰年定义如下:
闰年是指该年有366日,即较平常年份多出一日。闰年是为了弥补因人为历法规定的年度天数365日和平均回归年的大约365.24219日的差距而设立的。不同历法有不同置闰方法。儒略历每4年置1闰日,平均1年是365.25日。格里高利历每400年少3次闰日,平均是365.2425日。多出来的一天为2月29日。
儒略历作为格里历的前身,我们不必过于纠结,就按格里历(公历)来理解就可以了。简单来说,就是每逢闰年,2月份有29日为闰日。
有闰日的年分叫闰年,相反就是平年,平年为365天,闰年为366天。
这里要注意一下,农历(又称“旧历”)中有闰年闰月的说法,与公历中的闰年还是有蛮大区别的。农历每月天数是准确按照月相的盈亏圆缺周期来确定的,1个“朔”“望”月长约29.53日,历月制定时按大小月来区分,大月 30 天,小月 29 天。一年的时间以12个月为基准,平年比一回归年(太阳年)少约11天。因此,为了与回归年相匹配,每隔2到3年,增加一个月,增加的这个月为闰月,当年则为闰年。闰月按农历历法规则计算,逻辑规则略微有些复杂,在这里就不再展开。
本文还是以介绍公历的闰年规则为主。
闰年起始年份
在公历(格里历)中,闰年的起始年份是确定的。根据格里高利历,闰年的规则(公元后)由公元 4 年开始重新计算。这是因为公元前 46 年罗马皇帝恺撒大帝采纳了埃及天文学家索西琴尼(Sosigenes)的建议,在儒略历(格里历前身)中引入了闰年的概念,于公元前 45 年 1 月 1 日(第一儒略日)开始施行。为了修正日历系统中的时间偏差,恺撒大帝决定将每 4 年设立一个闰年,也就是每 4 年多一天。公元 4 年 2 月 25 日为第一个调准日。
因此,从公元 4 年开始,每 4 年就会有一个闰年。当然,格里历中为修正儒略历的误差,为闰年增加了更为完善的规则。不过这里面也有一些小 bug,格里历处理起来也可以说是简单直接。大家可以翻翻手机上的日历 App,找找看 1582 年的 10 月,会有惊喜。
还有一个额外的小知识,就是俄国的十月革命,实际是发生在 1917 年 11 月 7 日,但为什么会叫“十月”革命?其实也是因为,俄国当时使用的仍然是儒略历,没有根据公历矫正过对应的误差。
接下来,我们一起看看格里历中的置闰规则。
置闰规则
闰年的计算逻辑通常遵循以下规则:
-
能被4整除的年份是闰年。 这是最基本的规则。如果一个年份能被4整除(即年份能被4除尽,没有余数),那么它有可能是闰年。例如,2004年、2008年就是闰年,因为它们能被4整除。
-
但是,能被100整除且不能被400整除的年份不是闰年。 这个规则是为了修正规则 1 的过于宽松。如果一个年份能被100整除(即年份能被100除尽,没有余数),但不能被400整除,那么它不是闰年。例如,1900年就不是闰年,因为它能被100整除,但不能被400整除。
-
能被400整除的年份仍然是闰年。 即使一个年份能被100整除,但如果它能被400整除,那么它仍然是闰年。这个规则确保了2000年、2400年等能被400整除的年份是闰年。
这三条规则的组合确保了闰年的计算逻辑。通过这些规则,我们可以判断任意给定的年份是否为闰年。
两句话总结:
每一个可以被 4 整除的年份都是闰年,但可以被 100 整除的年份,必须也能被 400 整除才是闰年。因此,1700 年、1800 年、和 1900 年都不是闰年,而 2000 年是闰年。
一句话总结:
四年一闰,百年不闰,四百年再闰
其实,上述规则适用的范围也仅仅到公元 3200 年为止。如果推演到更广袤的时间长河里,还可以加上 2 条规则:
- 每 3200 年不闰;
- 每 172800 年闰;
理论上规则还可以继续往后延展,不过对于身处 2023 年的我们,意义已经不大了。真的比较好奇,3200 年的世界是怎样的,而 172800 年的地球又会是怎样一般模样?
总结
以前只知道闰年需要四年一闰,没想到根据历法,原来还有百年不闰和四百年再闰的规则。果然对于细节的知识点,还是需要本着务实的精神去深入了解清楚。
这里也可以看出,编程其实需要非常严谨的工作态度,也需要有充分的相关领域知识作为支持。
参考资料
- https://github.com/jackfrued/Python-100-Days
- https://zh.wikipedia.org/wiki/%E9%97%B0%E5%B9%B4
- https://zh.wikipedia.org/wiki/%E5%85%AC%E5%8E%86
- https://zh.wikipedia.org/wiki/%E5%84%92%E7%95%A5%E6%9B%86
- https://zh.wikipedia.org/wiki/%E8%BE%B2%E6%9B%86
- https://www.topys.cn/article/31374