前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每四年就出现一次的bug,凶手竟是他?

每四年就出现一次的bug,凶手竟是他?

作者头像
腾讯NEXT学位
发布2020-02-14 10:10:06
1.9K0
发布2020-02-14 10:10:06
举报
文章被收录于专栏:腾讯NEXT学位腾讯NEXT学位

2020年的开年,新型冠状病毒来得猝不及防,大家过了一个与以往不同的新年。

小N这段时间宅在家,除了吃饭就是睡觉,这日子过得都不知道是星期几了。翻了翻日历,才知道今天是2020年2月12号星期二。说起来,今年还是闰年呢!想必有很多同学已经把小学数学课本上的闰年知识忘了吧?小N今天就抓到了一个忘记闰年规则的同事小E!

小N:你知道什么是闰年吗?

小E:我知道我知道!闰年每四年一次,能被4整除的就是闰年,比如2020年!

小N:那1900年是闰年吗?

小E:1900年当然是闰年了!小N你的数学咋回事儿呀?

小N:才不是呢!我给你展示一下闰年的编程条件吧!

不知道大家有没有听过这样一句俗话

“四年一闰,百年不闰,四百年再闰。” 

意思是:

不是整百的年份只要被4整除的就是闰年,

整百的年份必须得被400整除。

那为什么会有闰年呢?

小N在度娘搜索了一下:

这么看来

闰年、闰月的存在

感觉就像是不精确历法的补丁

程序员能忍到今天也是不容易呀!

提到闰年

有一种bug叫做

闰年虫(leap year bug)

接下来进入小N科普时间

第一种:没有设置闰年 将2月都默认为只有28天,

那么当碰到闰年时,

2月29日便会误作3月1日处理。

(2月29生日的朋友落泪:

每四年才有一次的生日都不让人过了)

第二种:闰年规则出错

小N举两个例子来给大家说明这种情况~

①微软Zune音乐播放机

在2008年12月31日误以为闰年只有365天而进入实际上还未到的2009年1月1日,结果导致全球大当机。现在百度Zune贴吧还有用户开玩笑调侃微软四年一度的闰月bug。

小N在网上找到了Zune内置日期的更新驱动里的一段代码,大家可以分析思考一下~

代码语言:javascript
复制
while (days > 365) {      if (IsLeapYear(year)) {        if (days > 366) {          days -= 366;          year += 1;        }      } else {        days -= 365;        year += 1;      }    }

②PS3游戏机

PS3误将“四年一闰”当作“两年一闰”,在2010年3月1日错误当作不存在的2010年2月29日。导致全球PS3在当天都出现了无法使用的状况,被玩家在论坛疯狂吐槽。不过吐槽完bug,还是会大喊“索尼大法好!”

第三种:1900年问题

举个最典型的例子好了,excel就默认1900年是闰年,如果你输入日期格式的1900年2月28日,再往下拉自动填充,就会出现不存在的1900年2月29日。

小N温馨提醒:

虽然闰年问题看似一段简单的代码就可以解决

但如果出错却会引发大问题

在家远程办公的程序员一定要小心注意啦!

代码里可别出现闰年虫~

附上两种常见语言的闰年代码供大家参考~

① WPS表格:

=OR(AND(MOD(YEAR(单元格),4)=0,MOD(YEAR(单元格),100)<>0),MOD(YEAR(单元格),400)=0)

② Java

代码语言:javascript
复制
import java.util.Scanner;public class LeapYear {    public static void main(String[] args) {            Scanner input = new Scanner(System.in);        System.out.print("请输入年份:");        int year = input.nextInt();        if((year % 4 == 0 && year % 100 != 0) || (year%400==0 && year % 3200 != 0) || year % 172800 == 0)            System.out.print(year + "年是闰年。");else            System.out.print(year + "年不是闰年。");    }}

③ Python

代码语言:javascript
复制
# -*- coding: cp936 -*-temp = input("输入年份:")YEAR = int(temp)if (YEAR % 4 == 0 and YEAR % 100 != 0) or (YEAR % 400 == 0 and YEAR % 3200 != 0) or year % 172800 == 0:        print ("闰年")else:    print ("非闰年")

结语

时值新型冠状病毒爆发

社会各界纷纷出力抗击病毒

程序员也不例外

这几天

GitHubTrending TOP榜上

出现了一个开源项目

名叫 Wuhan2020

用于收集经过审核与确认过的

武汉新型冠状病毒防疫相关信息

现在已经有5.6k的Star

短短几天内已经有100+个PR被合进项目中

在这次疫情数据分析中

Python发挥了重要作用

比如:

用Python抓取疫情实时动态数据

画疫情地图

模拟预测肺炎数据等等

如果你被困在家中做不了什么

不如趁此机会来NEXT学院

跟着腾讯一线大咖学习Python

尽管这个闰年的开头不太顺利

但是我们的众志成城抗击病毒

爱和希望总是比病毒蔓延得更快

隔离病毒

不会隔离爱

我们的心始终在一起

春天总是在闰月来临

春天到了,离疫情结束也就不远了

武汉的亲人们

等到春暖花开的时候

我们一起去看樱花吧

在看点一下

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯NEXT学院 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档