介紹
2000年問題在英文中通常縮寫為Y2K。其中Y表示“year”也就是年,而K則表示拉丁前綴“kilo”,表示1000。Y2K或者就是指2000年。
一般來說,由於電腦程式中使用兩個數字來表示年份,如1998年被表示為“98”、1999年被表示為“99”;而2000年被表示為“00”,這樣將會導致某些程式在計算時得到不正確的結果,如把“00”誤解為1900年。在嵌入式系統中可能存在同樣的問題,這有可能導致設備停止運轉或者發生更加災難性的後果。
由於世界上各地的政府和企業都對兩千年問題給予了足夠的關注,1999年1月1日到2000年3月1日並沒有出現大範圍的計算機故障。
程式問題
兩千年問題始於1960年代,當時計算機記憶體和外部存儲介質的成本很高,大多數數據處理需要藉助於用穿孔卡片,它用80行文本表示所儲存的數據。那個時候的程式語言,如COBOL和RPG,使用ASCII碼和EBCDIC編碼表示數據。如果用四位數字表示年份,就要多占用儲存器空間,就會使成本增加,因此為了節省存儲空間,計算機系統的編程人員採用兩位數字表示年份,隨著計算機技術的迅猛發展,雖然後來存儲器的價格降低了,但在計算機系統中使用兩位數字來表示年份的做法卻由於思維上的慣性勢力而被沿襲下來。對大多數程式設計師來講,他們並不認為所編寫的軟體會持續使用很多年。
具體來講,兩千年問題要解決的事項包括以下幾個要點:
軟體在特定的日期會否出現運作錯誤。要留意的日期包括以下幾個日子:1999年1月1日、1999年4月9日(1999年的第99日)、1999年9月9日、1999年12月31日、2000年1月1日、2000年2月28日和2000年2月29日軟體會不會利用特定的日期格式來表示檔案完結,或檔案已刪除。軟體會否出現錯誤的日期,如“19100年”或“3000年”。兩千年問題是由Bob Bemer在1958年第一次提出的。在其後的二十年里,他用了很大的努力,希望政府、企業和國際組織(如IBM和ISO)來關注這個問題,但反響寥寥。直到2000年將要到來的時候,人們才感覺到兩千年問題的緊迫性。於是社會和政府都投入了大量的人力和物力來避免發生大規模的計算機災難。而從現在來看,這些努力也取得了相應的成果。
問題的引申
解決兩千年問題不是一朝一夕的事情。有些程式可能會免在2000年出現閏日而強行修改計算日期的過程。這些程式如果繼續在將來的閏年使用的話,有可能會導致日期錯亂。所以,我們還不要對兩千年問題掉以輕心。
另一方面,對於其它使用其它曆法的地區,如台灣的民國紀年或泰國的佛歷,類似問題也有可能在稍後年份出現。例如:民國100年就在2011年。如果所用的軟體沒有解決兩位年份的問題,那其實只是將兩千年問題從2000年推遲11年後再發生。
對於目前在世界上廣泛用作伺服器軟體的Unix系統來講,由於傳統的Unix系統使用32位的整型數表示日期(這個32位數字表示從1970年1月1日起至所存儲日期過去了多少秒),因此在2038年日期將會被卷回,這類似於兩千年問題。時間將可能重新從1970年1月1日開始計算,這將可能引起世界範圍的計算機故障。這被稱為2038年問題。
此外仍然有一個更加有趣的問題:是否存在10000年問題。當然,在10000年時候網際網路、人類文明、甚至世界都 有可能不再存在。縱然這些都是可能性的問題,但無論如何,這條仍是個充滿意思的問題。
所以,兩千年問題的關鍵在於計算機日期存儲的格式:時間可能是無限,但你只能夠用有限的儲存空間表示時間。涉及到日期的運算又是非常常見的一種運算。如果要徹底的解決這一類問題,就必須在設計硬體或者軟體時候充分估計到你所設計的對象可能服務的時間。並且找到最合適的日期表示方法,從而避免在將來可能出現的問題。
問題的延續
過往的程式設計師通過“把4位年份減去1900”這種懶惰的方法來取得2位年份的值。這種做法當延續至2000年之後,就會出現上圖的後果。
另外,有不少人以為過了公元2000年之後,“千年蟲”的問題就會自動消失。然而,若然沒有對編程方式作合適的修訂,問題在過了公元2000年依然會出現。以下為兩個在公元2008年曾經出現的千年蟲問題:
2008年是閏年,所以這一年有2月29日。不過,有相當數量的摩托羅拉舊款手提電話在這一天由於系統無法表示這一日,電話的日期被系統強制重置為2001年1月1日。
千年蟲騙案
在2000年之前,香港有不少騙徒宣稱有千年蟲杜蟲藥,誘騙對千年蟲問題一知半解的民眾購買(有部分不熟悉計算機的市民以為千年蟲是一種類似瘟疫、傳染病等病毒),是當時候典型的街頭騙案,電視節目警訊亦不時提醒市民慎防騙局。