2000年問題(英語:Year 2000 Problem,簡稱:Y2K[1]),中國大陸及香港常稱千年蟲問題[2][3],台灣則稱千禧蟲危機[4],是一個電腦程式在日期表達上的設計缺陷,該缺陷會導致電腦錯誤辨識2000年及之後的年份,從而導致其日期辨識紊亂,使得電腦執行任何與時間相關的任務時都會出錯,進而影響整個系統的執行。該問題主要涉及到許多老舊的電腦,為了節省儲存空間,它們的程式普遍採用6位數字來儲存時間,只取四位年份數字中的後兩位數字用於表示年份。這種做法使得電腦無法辨識和更變前兩位年份,從而導致了年份的誤讀[5][6][7][8][9]。很多這些老舊的電腦直到臨近2000年時都還工作在政府部門、軍隊、基礎設施與許多重要行業當中。一旦工作在這些領域的電腦出現問題,將可能導致從停水、斷電,銀行癱瘓到核電廠事故和軍械失控等一系列災難性的後果[10][11][12][13][14][15]。
自20世紀90年代開始,2000問題逐漸透過媒體的傳播引起了人們的關注,同時也引發了大眾恐慌[16][17][18][19]。針對該問題進行的全球性大規模修復行動也隨之開始,全世界為修復2000年問題前後累計投入了約3080億美元[20],而在持續數年的修復之後,該問題最終得到了有效解決,沒有在新千年到來之際大規模爆發[21][22][23][24]。
問題起因
雖然2000年問題的中文別稱「千年蟲」常使人將其誤認為電腦病毒,但實際上它只是一個電腦程式在日期表示方面的缺陷,並非惡意編寫的電腦病毒[2]。該問題起始於20世紀60年代,那時電腦的記憶體價格極為昂貴,早期的磁芯記憶體價格平均為每位元1美元[26],並且容量很小[9]。且當時的電腦仍舊採用打孔卡來儲存數據,一個最常見的IBM打孔卡只有80列寬,能儲存的數據也極其有限。因此,程式設計師在編寫程式時需要儘可能的節省儲存空間,以最大程度的降低儲存成本。因此,當時的程式設計師普遍在編寫程式時採用六位數來儲存時間,只取四位數年份中的後兩位來表示年份,例如,1976年10月23日就會被簡短的儲存為23/10/76或10/23/76[27][10]。對當時的情況來說,六位數日期表示法有很大的作用,它能夠減小程式的主記憶體需求,並減少一個程式所要佔用的打孔卡卡數。事實上,這種做法在更早之前的制表機時代就已經被使用。在要處理大量日期數據時,六位數日期表示法還能發揮更大的作用。例如,一間擁有一千萬客戶,每個客戶每天交易三次的銀行若要在電腦中儲存一周所有客戶的交易時間,只取兩位數年份能為這家銀行省下60百萬位元組的儲存空間[9]。後來,隨着科技的發展,到了20世紀70年代,磁芯記憶體的價格逐漸下降到僅為每位元1美分[26]。而同時,具有同樣價格,但尺寸更小且更便於使用的DRAM也開始逐步替代了磁芯記憶體[28],打孔卡亦被逐漸淘汰,儲存技術的進步和其價格的大幅降低使得儲存空間不再是一個緊迫的問題。在程式中使用六位數日期的必要性也越來越低,但其並沒有就此退出歷史舞台,出於程式設計師們的習慣,以及為了保持向上相容,這一日期表示法被一直沿用下來[29][27],即使當時已經有人提出過在這一日期表示法下潛藏的問題[30][31],但當時的程式設計師普遍都認為自己編寫的程式不可能被持續使用到新千年,並沒有理會這些警告[9][32]。
六位數日期表示法雖然的確在節省儲存空間上發揮出了作用,但這種模糊的表示法也為未來埋下了隱患。人們在日常生活中為了方便有時也會只用兩位數簡稱一個年份,但電腦和人類的區別在於,人類擁有能夠理解並補全前兩位年份數字的能力,但電腦沒有。它們只會讀取被實際寫出來的後兩位年份,無法自行變更沒被實際寫出來的前兩位年份數字。這就導致了一個問題:在六位數日期下,2000年1月1日將會被轉為01/01/00,然而,由於前兩位年份沒被實際寫出來,也就無法進行變更,電腦就會繼續將前兩位預設為「19」,如此一來,就使得電腦會將2000年誤認為1900年,認為被縮寫為「00」的2000年要早於被縮寫為「99」的1999年[30][6][9][33]。這會導致電腦在執行任何涉及到日期的任務時出錯,甚至引發崩潰。例如,醫生要使用一台電腦為一位出生在2000年3月16日的嬰兒計算要為他使用的藥物劑量,若這台電腦仍舊使用六位數日期表示法,其就會將這位嬰兒誤認為是一位出生在1900年3月16日的百歲老人,並對醫生給出一個適用於老年人的藥物劑量,但這個劑量對新生兒來說可能會是致命的。若不對該問題加以修復,諸如此類的故障會在2000年到來時在全球爆發,影響到所有依賴這些有缺陷的電腦運作的基礎設施和軍政機關,導致停電停水、醫療癱瘓、通訊終止到導彈誤射等一系列災難性的後果[27][10][16]。
此外,2000年問題也會在除2000年1月1日以外的日期造成影響,並且也不止會導致電腦誤判2000年及之後的年份。因為問題的根源是電腦無法變更前兩位的年份數字,其也會導致電腦錯誤判定1900年之前的年份[10][34];一些使用數字99或9999作為文件終止標記或停止代碼,且仍舊採用兩位數年份表示法的電腦可能會在1999年9月9日出現故障;2000年問題還可能會使一些電腦無法將2000年正確辨識為閏年,從而導致它們在2000年2月29日、3月1日、12月31日和2001年1月1日出現故障[3][35]。
引起關注
1958年,當時在IBM工作的鮑勃·貝默在為耶穌基督後期聖徒教會編寫族譜記錄軟件時意識到了六位數日期寫法的缺陷[32],他在之後的數十年裏不斷在各處做出對六位數日期寫法缺陷的擔憂,並呼籲人們轉用標準的八位完整日期寫法,但都沒有起到很大的作用。其於1971年在霍尼韋爾電腦期刊上發表了一篇題為《What's the Date?》的文章,建議人們使用ISO 2014標準的規範日期寫法[31],這被認為是世界上第一篇公開發表的2000年問題警告文章[36],1979年,他再於雜誌介面時代發表另一篇文章《Time and the computer》,進一步深入探討了日期表示問題,他在這篇文章中也提到了2000年閏年問題[30]。
問題的引申
有些程式可能會免在2000年出現閏日而強行修改計算日期的過程。這些程式如果繼續在將來的閏年使用的話,有可能會導致日期錯亂。
另一方面,對於使用其它曆法的地區,如台灣的民國紀年或日本的和曆,類似問題也有可能在之後的年份出現。例如:民國100年就在2011年。如果所用的軟件沒有解決兩位年份的問題,那其實只是將兩千年問題從2000年推遲11年後再發生。
對於目前在世界上廣泛用作伺服器軟件的Unix系統來講,由於傳統的Unix系統使用32位元的整型數表示日期(這個32位元數字表示從1970年1月1日起至所儲存日期過去了多少秒),因此在2038年日期將會被捲回,這類似於2000年問題。時間將可能重新從1970年1月1日開始計算,這將可能引起世界範圍的電腦故障。這被稱為2038年問題。
此外仍然有一個問題:是否存在10000年問題。當然這是一個遙不可及的問題。
問題的延續
有觀點認爲過了公元2000年之後,「千年蟲」的問題就會自動消失。然而,若然沒有對編程方式作合適的修訂,問題在過了公元2000年依然會出現。以下為兩個在公元2008年曾經出現的千年蟲問題:
- 2008年是閏年,所以這一年有2月29日。不過,有相當數量的摩托羅拉舊款手提電話在這一天由於系統無法表示這一日,系統將電話的日期強制重設為2001年1月1日。
- 在現代瀏覽器和網頁設計中,如需將年份簡寫爲兩位數字,通常直接取年份的最後兩位(如將2021年簡寫爲「21」)。但如使用已廢用的JavaScript「.getYear()」函數,利用「把4位元年份數字減去1900」的方式來取得兩位年份數字,則會出現「不正常」的結果,例如將2021年顯示為「121」。
1999年年底,在全世界程式設計師在為千年蟲問題焦慮的的時候,日本程式設計師卻靈機一動:如果繼續沿用昭和(1926年開始)年號的話,千年蟲會足足延後25年(延至2025年)。如此之長的時間足夠解決這次的問題了。然而日本在2019年改元為令和時,不但要更改年號,而且昭和時代年號計算的「新千年蟲」(昭和100年)馬上就要來臨(昭和100年問題)[37]。
參看
參考文獻
外部連結
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.