當前位置: 華文星空 > 知識

有哪些讓你目瞪口呆的 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公眾號