python计算闰年

这里说明一下:看到网上很多写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日。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值