那些和闰年相关的 Bug

简介:

2020年到了,祝大家新年快乐!

2020年是一个闰年(Leap Year),闰年是会出故障的。八年前,2012年2月29日,我在Azure的时候我们就出了一个大故障:
https://azure.microsoft.com/en-us/blog/summary-of-windows-azure-service-disruption-on-feb-29th-2012/

常见的错误认知

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天,可能也会导致问题。例如,2008年12月31日,第三方软件中的问题导致了所有Microsoft Zune设备无法使用,详情参考:
http://www.theguardian.com/technology/blog/2009/jan/01/zune-firmware-mistake

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

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

闰秒

除了闰年,还有一个东西叫闰秒,详情参考:
https://en.wikipedia.org/wiki/Leap_second

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

本文作者:
郑子颖,花名南门,现任职蚂蚁金服 国际事业群 质量和技术风险部 资深总监。上海交通大学计算机系硕士毕业后加入微软,2018年加入蚂蚁金服。从事软件开发18年,工作重心主要围绕着测试、质量以及工程效能。目前,我团队正在国内和海外多地招聘测试开发岗位,欢迎海内外专业人士加入我们,职位详情:

https://hire.alibaba-inc.com/i18n/positionDetail.html?positionId=576717

相关文章
Java 如何根据域名查询对应的ip地址
Java 如何根据域名查询对应的ip地址
1216 3
|
Web App开发 搜索推荐 机器人
真假搜索引擎蜘蛛IP地址和UA(UserAgent)大全
真假搜索引擎蜘蛛IP地址和UA(UserAgent)大全 这些信息不是一直不变的,这里仅供参考。
2353 0
真假搜索引擎蜘蛛IP地址和UA(UserAgent)大全
|
6月前
|
消息中间件 存储 监控
实时数据有哪些特点?企业该如何管理好实时数据?
企业正从“事后看”转向“实时看”数据,实时数据要求秒级甚至毫秒级响应,具备持续流入、价值衰减快、流量突增等特点。管理好它需构建四大能力:流式处理架构、全链路监控、分层服务与业务闭环。建议从痛点场景试点,逐步打造可复用的实时数据体系。
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
10月前
|
Ubuntu 安全 Linux
十款常用Linux系统介绍
本文不是什么大盘点。市面上有好几百款发行版,每款发行版在某个方面都与众不同。不可能在此全部罗列,本文只罗列了十款最常见的Linux发行版(世界上只有两种人,一种是懂二进制的,另一种是不懂二进制的)。请宣传Linux的魅力或威力。
|
人工智能 安全 数据安全/隐私保护
HarmonyOS应用开发实战:基于ArkTS的开箱即用登录页面实现【样式方式实现①】【HarmonyOS 5.0(Next)】
本文介绍了基于HarmonyOS 5.0(Next)和ArkTS实现的开箱即用登录页面。HarmonyOS 5.0是华为于2024年10月22日发布的第三代移动操作系统,具备原生智能、互联、安全及流畅特性。文章详细解析了使用ArkTS开发登录页面的代码,涵盖组件定义、界面布局、事件处理、样式设置及异步操作等内容,展示了清晰的组件结构、响应式设计与模块化编程的优势。通过这段代码,开发者可以快速上手并构建高效、美观的应用界面。
|
存储 人工智能 编译器
【AI系统】CPU 指令集架构
本文介绍了指令集架构(ISA)的基本概念,探讨了CISC与RISC两种主要的指令集架构设计思路,分析了它们的优缺点及应用场景。文章还简述了ISA的历史发展,包括x86、ARM、MIPS、Alpha和RISC-V等常见架构的特点。最后,文章讨论了CPU的并行处理架构,如SISD、SIMD、MISD、MIMD和SIMT,并概述了这些架构在服务器、PC及嵌入式领域的应用情况。
1850 5
|
前端开发 JavaScript API
wangEditor富文本编辑器的调用开发实录(v5版本、获取HTML内容、上传图片、隐藏上传视频)
wangEditor富文本编辑器的调用开发实录(v5版本、获取HTML内容、上传图片、隐藏上传视频)
2384 0
|
机器学习/深度学习
yolov7论文学习——创新点解析、网络结构图
yolov7论文学习——创新点解析、网络结构图
|
SQL Java 关系型数据库
mybatis-plus启动时自动执行sql脚本
mybatis-plus启动时自动执行sql脚本
578 1