细恐至微,那些与闰年有关的bug

什么是闰年

公历闰年判定遵循的规律为:四年一闰、百年不闰、400年再闰。

中国旧历农历每月的天数依照月亏而定,一年的时间以12个月为基准,平年比一回归年少约11天。为了合上地球围绕太阳运行周期即回归年,每隔2到4年,增加一个月,增加的这个月为闰月。那么闰年应该怎么计算?

闰年的计算方法:
1、普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年)

2、世纪年能被400整除的是闰年。(如2000年是闰年)

3、对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。如172800年是闰年,86400年不是闰年(因为虽然能整除3200,但不能整除172800)(此按一回归年365天5h48’45.5’'计算)。

那么用算法来实现就是:

         public static bool IsLeap(int yN)
         {
 
             if ((yN % 400 == 0 && yN % 3200 != 
                || (yN % 4 == 0 && yN % 100 != 
                || (yN % 3200 == 0 && yN % 172800 == 0))
                 return true;
             else
                 return false;
 
        }
细恐至微,居然有这样一个bug

1880年到2020年中是闰年的有以下这些年份:

1880年、1884年、1888年、1892年、1896年、1904年、1908年、1912年、1916年、1920年、1924年、1928年、1932年、1936年、1940年、1944年、1948年、1952年、1956年、1960年、1964年、1968年、1972年、1976年、1980年、1984年、1988年、1992年、1996年、2000年、2004年、2008年、2012年、2016年、2020年。

于是我打开我的iphone手机看了一下1990年的日历
在这里插入图片描述
1990在并不是闰年,2月份居然有29天

在这里插入图片描述
1900年有2月29日!看完后我整个感觉都不好了,开始怀疑人生。那一天的人们在干嘛?

据说有人看到这里,赶快看看自己的android手机(ps:确实没毛病)
在这里插入图片描述

抽了根烟,情不自禁的我打开了熟悉的windows电脑,心里默念了一句"微软大法好’。

熟悉的微软终于没有让我失望
在这里插入图片描述

常见的认知错误

  • 一年总是365天
  • 2月总是28天
  • 闰年时每四年一次

这些bug与闰年有关:
1、在一个日期值上加或减时间的代码。尤其是加减1年或1个月的代码

2、各种根据数据库查询结果生成的报表和图标,月度和年度统计可能会少算1天

3、证书/密码/密钥/缓存 等的过期时间,可能会比预期的早了一天,或者可能设定了一个非法的过期时间

4、固定长度的数组。例如,一个长度为365的数组遇到闰年可能就不够了,可能会数组越界。

5、UI组件,例如日历、日期选择组件,以及客户端输入校验相关的代码。

闰秒?
除了闰年,还有一个东西叫闰秒。
“闰秒”就是1分钟有61秒, “跳秒”都安排在6月30日,或是12月31日的最后一瞬间。
在这里插入图片描述
详情参考:
https://en.wikipedia.org/wiki/Leap_second

参考资料

https://discussions.apple.com/thread/5982489?tstart=0

https://docs.microsoft.com/en-us/office/troubleshoot/excel/wrongly-assumes-1900-is-leap-year

https://blog.csdn.net/weixin_39860915/article/details/103917840

https://en.wikipedia.org/wiki/Leap_second

作者信息
【文章信息】:作者-张林:原文链接-https://blog.csdn.net/kebi007/article/details/103959512
【原创公众号】:dotNet全栈开发。文章目录
版权声明:本文为CSDN博主「dotNet全栈开发」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值