当前位置: 华文星空 > 知识

有哪些让你目瞪口呆的 Bug ?

2020-03-11知识

iPhone手机日历有个严重的bug

众所周知1900年是平年,不是闰年,而iOS的日历似乎是简单的4年一个闰年的算法算闰年的。这么大的bug怎么没人发现呢?iOS11上还有。

应该说计算闰年还是很简单的,4年100年400年等等数据判断一下就好,结果还是出错,苹果工程师的水平哪去了?

=========10/10/2017 更新=================

评论区里面同学的回复促使我详细调查了一下,更新如下:

微软1900年站在了正确这一边:

我是不是该大喊「微软大法好!」了?慢着,当我打开Excel,输入2/29/1900,它会认为是个有效的日期,并将其转化成29-Feb-00,就如同我敲入2/28/1900一样。而如果我输入2/30/1900,则被认为是个无效日期而忽略,如下图:

看来微软也是自相矛盾啊。这是为什么呢?我决定搜索一下,发现这还真是个冷门的问题,关键字应着寥寥。不过终于被我找到了答案,原来微软Excel和iPhone的bug起因还不一致。

微软Excel

在PC开始出现的初期,IBM的Lotus 1-2-3是PC的杀手应用,它被认为是PC所以成功的因素之一。Lotus 1-2-3纪元(epoch)从1900年开始,所以第一天是1900年1月1日,其后所有的日期都是在它上面加一个Delta差值,这也是为什么我们上面1900年2月28是的年份表示是00的原因。Lotus从诞生起就有个bug,它认为1900年是闰年!

微软因为Lotus的大卖而自己研发的表格系统Multiplan,它和它的继任者Excel为了能够与Lotus兼容,不但要做到外观十分相似,而且为了能够读取Lotus的文件而故意引入了一样的bug:将1900年设定为闰年!他们甚至声称这不是一个bug,而是一个feature!这真是Bug for bug的高度兼容啊。

包袱一旦背上就很难卸下,在Lotus早已作古的今天,Excel为了与以前的Excel兼容,还在继承着这个」feature」,我们参考资料[1]里面有微软的官方解释。

Apple

在古老的Apple I诞生之日起,苹果的纪元就是从1904年1月1日开始,它用32bit记录了从那之后的秒数,所以老的MAC系统最大能够记录到2040年(新的MAC扩展了位数)。而1904年之前则是通过简单的4年一个闰年的方法倒推到之前的年份,所以1900年被错误的认为是闰年而2100年不会。这种方式也被iOS所继承。后期因为兼容性问题,不做修改。曾经有人报告给Apple这个iPhone上的Bug,Apple的开发者未有回应(参考资料[2])

参考资料

[1]: https:// support.microsoft.com/e n-us/help/214326/excel-incorrectly-assumes-that-the-year-1900-is-a-leap-year

[2]: https:// discussions.apple.com/t hread/5982489?tstart=0

[3]: 【软件随想录:程序员部落酋长】

另外此文被整理发表在专栏:UEFI和BIOS探秘

也许是最冷的电脑冷知识:1900年闰年Bug

其他更多文章,欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号"UEFIBlog",在那里有最新的文章。同时欢迎大家给本专栏和公众号投稿!

用微信扫描二维码加入UEFIBlog公众号