2020年是一个闰年(Leap Year),闰年是会出故障的。

常见的错误认知


1、 一年总是365天

2、2月总是28天

3、闰年是每四年一次

其实,闰年并不是每四年一次。2000是闰年,但1900年和2100都不是闰年。

 哪里容易出闰年相关的Bug


1、在一个日期值上加或减时间的代码。尤其是加减1年或1个月的代码

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

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

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

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

闰年的哪些日子要特别注意


2019年12月31日:这是闰年前一年的最后一天。2019年的最后一天加365天,并不是2020年的最后一天,而会是2020年的倒数第二天(即2020年12月30日)。

2020年1月1日:闰年的第一天。闰年的第一天加365天,并不是下一年的1月1日,而是今年的12月31日。

2020年1月31日:这一天加28天,并不是下个月(2月)的最后一天。

2020年2月1日:这一天加28天,并不是下个月(3月)的第一天。

2020年2月28日:这是2月29日的前一天。有问题的代码可能会错误的把这天当成2月的最后一天,试图加1天得到3月1日。但实际上这一天加1天是2月29日。

2020年2月29日:这是闰年多出来的一天。如果代码以为2月总是只有28天,那代码可能出现各种问题,例如:

入参校验会认为一个合法输入(2020/2/29)是非法的,用```{ year+1 , month , day }```的方式来加减1年的话会产生一个非法日期。

2020年3月1日:2月29日后面的那天。代码如果在3月1日上减28天,会得到2月2日(而不是预期中的2月1日);减365天的话会得到2019年3月2日(而不是预期中的3月1日)。

2020年12月31日:一年的第366天。

代码如果不能正确处理一年的第366天,可能也会导致问题。

代码如果假设1年永远是365天,声明了一个固定大小为365的数组,那在一年的第366天可能会发生数组越界。

数组越界如果发生在 C/C++ 语言编写的代码里,可能导致内存溢出攻击漏洞。

闰秒


除了闰年,还有一个东西叫闰秒,详情参考:

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

不过由于在阿里巴巴经济体大部分同学平时相处的都是应用层代码,处理的都是日月年,最多也就精细到小时和分钟,闰秒对我们的影响相对小很多。闰秒对于GPS等一些对时间的精密度要求比较高的系统会影响比较大。

本文作者:

郑子颖,花名南门,现任职蚂蚁金服 国际事业群 质量和技术风险部 资深总监。上海交通大学计算机系硕士毕业后加入微软,2018年加入蚂蚁金服。从事软件开发18年,工作重心主要围绕着测试、质量以及工程效能。

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

那些和闰年相关的 Bug相关推荐

  1. oracle wallet相关的bug|oracle wallet使用注意事项|ORA-28374: typed master key not found in wa

    ### Code Reference URL:https://blog.csdn.net/cpongo6/article/details/88793610 DESC:oracle wallet相关的b ...

  2. ASN (Advance Shipment Notice) 流程 以及shipment 相关的bug

    这篇文章先讲讲ASN 的流程, 顺便讲讲在做流程的时候碰到的一些跟shipment 相关的bug. 首先我们创建一个PO: 最简单的那种 这时我们要去创建ASN, 也就是提前发货通知. 既然是发货通知 ...

  3. android:ellipsize=end 不起作用,android:ellipsize=end 失效或者 相关的Bug

    其实这文章有点傻逼. 相关的问题 TextView android:ellipsize="end"超出一个字符时不显示-的解决 http://www.pocketdigi.com/ ...

  4. Windows Live Writer连接sharePoint博客时,有一个权限相关的BUG

    场景: 添加博客帐户 时候,填写sharePoint博客地址之后,出现下列对话框, 错误提示: 尝试检测博客设置时发生以外错误:博客服务器错误-发生服务器错误 2041 尝试执行未经授权的操作. 导致 ...

  5. 阿里问题定位神器 Arthas 的骚操作,定位线上BUG,超给力!

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"1024"获取公众号专属1024GB资料 来源:rrd.me/fE3qP 背景 公司有 ...

  6. 【转载】关于对方法实例化的相关感悟以及unity的50个技巧

    关于实例化问题的感悟(笔者自悟,大神勿喷) 在之前的程序编写过程中,虽然对相关的方法进行了实例化,但是在运行的时候总是会出现"未将对象引用设置到对象的实例",出现该种问题的原因是由 ...

  7. Android-FixBug热修复框架的使用及源码分析(不发版修复bug)

    前面几篇博文已经介绍了2种热修复框架的使用及源码分析,AndFix兼容性比较好,而Dexposed Art处于Beta版. AndFix和Dexposed都是阿里的开源项目.  Alibaba-And ...

  8. 从 bug 中学习:六大开源项目告诉你 go 并发编程的那些坑

    作者:richardyao,腾讯 CSIG 后台开发工程师 并发编程中,go 不仅仅支持传统的通过共享内存的方式来通信,更推崇通过channel来传递消息,这种新的并发编程模型会出现不同于以往的bug ...

  9. 嵌入式Linux内核移植相关代码分析(转)

    本文通过整理之前研发的一个项目(ARM7TDMI +uCLinux),分析内核启动过程及需要修改的文件,以供内核移植者参考.整理过程中也同时参考了众多网友的帖子,在此谢过.由于整理过程匆忙,难免 错误 ...

最新文章

  1. centOS 自动安装php
  2. vue-自定义过滤器--时间
  3. mysql视图子查询_mysql创建视图不能包涵子查询的解决办法。View's SELECT contains a subquery in the FROM clause...
  4. 使用NETSH来绑定ARP
  5. 扩展entity framework core实现默认字符串长度,decimal精度,entity自动注册和配置
  6. python达梦数据库_Python 编程可以访问达梦数据吗?
  7. 容易被忽略的注解,你能了解多少?
  8. c语言答案选择题,C语言选择题(附答案)
  9. 大家推荐一下开源的博客和论坛整合在一起的.net系统
  10. 查看JVisualVM查看信息
  11. 华为笔记本换装linux双系统,华为及荣耀笔记本装Deepin双系统不能引导Windows的解决...
  12. 为RemoteApp的登录用户(域用户)添加输入法的方法
  13. python pgm 转 bmp
  14. 十大著名黑客-----李纳斯-托瓦兹
  15. keil4单片机串口通信
  16. 引用qcustomplot编译错误undefined reference to `_imp___ZN8QPrinterC1ENS_11PrinterModeE'
  17. 实战捕获局域网ARP病毒
  18. 计算机公共课6——数据库管理系统与 Access 2010
  19. freeRTOS学习(三)
  20. 20年后的iphoneXXXX手机长这样

热门文章

  1. jsp mysql 音乐网站_Maven+JSP+Servlet+C3P0+Mysql实现的音乐库管理系统
  2. java 分享巧克力_[leetcode 双周赛 11] 1231 分享巧克力
  3. linux php木马下载,Linux shell快速查找PHP木马
  4. android audit2allow工具使用步骤
  5. 计算机网络之物理层:3、奈式准则和香农公式
  6. Reactor模式和Proactor模式
  7. Java数字匹配的kmp算法
  8. Ubuntu更换国内源(apt更换源)
  9. JS Math对象(算数、四舍五入、随机数)
  10. 15.IDA-查看XREF列表(Ctrl+x)