这里说明一下:看到网上很多写python计算闰年的,有很多是不同。
有份省级期刊万年历计算公元1-10000年的闰年
算法如下:4000年停闰一次。区别其他算法,有些是3200年停闰一次。
目前历法方面,比较完整的说法是:
- 格里历的闰年计算,目前现在比较完整的说法是:四年一闰, 百年不闰,四百年再闰,四千年不闰,万年不闰,二万年再闰,十万年不闰。
- 至于原因就是由于回归年并不是整数引起的。
- 文档中只计算了万年以内的(不包括公元10000年),当然也没有公元0年这个概念。
def division(dividend, divisor) -> bool:
"""
:param dividend: 被除数
:param divisor: 除数
:return: bool
"""
if not isinstance(dividend, int):
raise NotIntegerError(f"被除数不是整数,dividend:{dividend}")
if not isinstance(divisor, int):
raise NotIntegerError(f"除数不是整数,divisor:{divisor}")
if divisor == 0:
raise DivisorZeroError(f"除数不能为0,divisor:{divisor}")
return dividend % divisor == 0
def is_leap_year(year):
"""
功能:计算是否为闰年
:return:
"""
leap = False
if division(year, 4000):
return False
elif division(year,400):
return True
elif division(year,4) and not division(year,100):
return True
else:
return False
之前看到问答上回答是也是思路正确的:
- 我只是说根据现在的规则是没法判断一个大于3200年以上的年份是否是闰年。
- 为什么呢,地球围绕太阳的公转周期大概是365天5时48分46秒,写成小数形式是365.2422天。
- 写成小数点是因为人类闰是闰一天,所以单位统一比较好算,就不用小时分秒了。
- 所有闰法都是为了使日历的周期和绕太阳公转的周期对应得上,误差不超过一天(不超过闰一天的校正范围。)在没有闰四年的规则下,每年会有0.2422天的误差,累积五年就超过1,所以会四年闰一次。
- 但是1-0.2422*4=0.0312,这种闰法校正过头,又会引入新的误差,每4年累积0.0312天。
- 大概累积1/0.0312*4=128.205128205年后又会达到最大校正范围。但是128这个数字显然不好记,所以就取100,每100年停闰一次就能缩小误差。
- 但是新误差又来了,停闰一年缩小误差同时,又引入新误差,这个误差是1-100/4*0.0312=0.22。也- 就是说每100年会累积0.22天。累积500年误差就会>1,所以400年的时候不能停闰了,必须重新闰起来。
- 解决了每百年累积的误差,400年重闰又带来新误差,这个误差是1-0.224=0.12。按照这个算法那么当1/0.12400=3333.333333333年这个误差就会达到1。所以我们又必须停闰,3200年必须停闰。故3200年是平年,但是按照现在的规则3200年是闰年。
本质是回归年的问题:
- 一种就是按照4000年停闰
- 一种是按照3200年停闰
本质都在弥补误差。
实际是更精确的是:
格里历(现行公历)的历年平均长度为365.2425日,接近平均回归年的365.242199074日,即约每3300年误差一日,也更接近春分点回归年的365.24237日。