那些和闰年相关的 Bug

2020 年 1 月 23 日 CSDN

作者 | 郑子颖

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等一些对时间的精密度要求比较高的系统会影响比较大。

本文缩略图:icon by ionchan

本文作者:

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

【End】

热 文 推 荐 


解析春运玄学:携程飞猪去哪儿们的抢票加速包,到底灵不灵?
盘点 12 款让开发效率“飞起”的 VS Code 插件
悲痛!临近年关,一位 IT 创业者自杀,曾卖房给员工发工资
回家的票抢上了吗?聊聊12306为什么时不时要崩一下

☞小网站的容器化(上)

区块链第一,情商上榜,2020找工作需要哪些技能?

你点的每个“在看”,我都认真当成了喜欢
登录查看更多
0

相关内容

Windows Azure是微软基于云计算的操作系统,现在更名为“Microsoft Azure”,和Azure Services Platform一样,是微软“软件和服务”技术的名称。Windows Azure的主要目标是为开发者提供一个平台,帮助开发可运行在云服务器、数据中心、Web和PC上的应用程序。云计算的开发者能使用微软全球数据中心的储存、计算能力和网络基础服务。Azure服务平台包括了以下主要组件:Windows Azure;Microsoft SQL数据库服务,Microsoft .Net服务;用于分享、储存和同步文件的Live服务;针对商业的Microsoft SharePoint和Microsoft Dynamics CRM服务。
【经典书】人工智能及机器学习导论,457页pdf
专知会员服务
160+阅读 · 2020年7月5日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
打怪升级!2020机器学习工程师技术路线图
专知会员服务
98+阅读 · 2020年6月3日
近期必读的6篇AI顶会WWW2020【推荐系统】相关论文
专知会员服务
56+阅读 · 2020年2月25日
【LinkedIn报告】深度自然语言处理的搜索系统,211页pdf
专知会员服务
107+阅读 · 2019年6月21日
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
量化交易系列课程
平均机器
10+阅读 · 2019年5月9日
已删除
创业邦杂志
5+阅读 · 2019年3月27日
BAT机器学习面试1000题(721~725题)
七月在线实验室
11+阅读 · 2018年12月18日
BAT机器学习面试1000题(716~720题)
七月在线实验室
19+阅读 · 2018年12月17日
论文落地 101:算法工程化的那些坑
PaperWeekly
13+阅读 · 2018年11月3日
为什么你应该学 Python ?
计算机与网络安全
4+阅读 · 2018年3月24日
150 多个 ML、NLP 和 Python 相关的教程
Python开发者
14+阅读 · 2017年8月15日
Arxiv
38+阅读 · 2020年3月10日
Arxiv
102+阅读 · 2020年3月4日
Arxiv
14+阅读 · 2020年1月27日
Feature Selection Library (MATLAB Toolbox)
Arxiv
7+阅读 · 2018年8月6日
Arxiv
5+阅读 · 2015年9月14日
VIP会员
相关VIP内容
【经典书】人工智能及机器学习导论,457页pdf
专知会员服务
160+阅读 · 2020年7月5日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
打怪升级!2020机器学习工程师技术路线图
专知会员服务
98+阅读 · 2020年6月3日
近期必读的6篇AI顶会WWW2020【推荐系统】相关论文
专知会员服务
56+阅读 · 2020年2月25日
【LinkedIn报告】深度自然语言处理的搜索系统,211页pdf
专知会员服务
107+阅读 · 2019年6月21日
相关资讯
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
量化交易系列课程
平均机器
10+阅读 · 2019年5月9日
已删除
创业邦杂志
5+阅读 · 2019年3月27日
BAT机器学习面试1000题(721~725题)
七月在线实验室
11+阅读 · 2018年12月18日
BAT机器学习面试1000题(716~720题)
七月在线实验室
19+阅读 · 2018年12月17日
论文落地 101:算法工程化的那些坑
PaperWeekly
13+阅读 · 2018年11月3日
为什么你应该学 Python ?
计算机与网络安全
4+阅读 · 2018年3月24日
150 多个 ML、NLP 和 Python 相关的教程
Python开发者
14+阅读 · 2017年8月15日
相关论文
Top
微信扫码咨询专知VIP会员