2000年問題

圖中就是2000年問題所造成後果的一個實例，這個懸掛於南特中央理工學院的電子標誌將2000年1月3日錯誤顯示為1900年1月3日。2000年問題（Year 2000 Problem，別稱Millennium Bug或Year 2000 Bug，簡稱Y2K），中國大陸及香港常稱-{zh-hans:千年蟲;zh-hant:千年蟲;}-問題，臺灣則稱-{zh-hans:千禧蟲;zh-hant:千禧蟲;}-危機，是一個計算機程序在日期表達上的設計缺陷，該缺陷會導致計算機錯誤識別2000年及之後的年份，從而導致其日期識別紊亂，使得計算機執行任何與時間相關的任務時都會出錯，進而影響整個系統的運行。該問題主要涉及到許多老舊的計算機，為了節省存儲空間，它們的程序普遍採用6位數字來存儲時間，只取4位年份數字中的後2位數字用於表示年份。這種做法使得計算機無法識別和更變前兩位年份，從而導致了年份的誤讀。很多這些老舊的計算機直到臨近2000年時都還工作在政府部門、軍隊、基礎設施與許多重要行業當中。一旦工作在這些領域的計算機出現問題，將可能導致從停水、斷電，銀行癱瘓到核電廠事故和軍械失控等一系列災難性的後果。
自20世紀90年代開始，2000問題逐漸透過媒體的傳播引起了人們的關注，同時也引發了大眾恐慌。針對該問題進行的全球性大規模修復行動也隨之開始，全世界為修復2000年問題前後累計投入了約3080億美元，而在持續數年的修復之後，該問題最終得到了有效解決，沒有在新千年到來之際大規模爆發。

**問題起因**
IBM 1401的磁芯存儲器模塊，其容量僅為4KB的版本即要價20100美元，換算到2015年時即為162000美元。
雖然2000年問題的中文別稱“千年蟲”常使人將其誤認為電腦病毒，但實際上它只是一個計算機程序在日期表示方面的缺陷，並非惡意編寫的電腦病毒。該問題起始於20世紀50年代到60年代，那時計算機的存儲器價格極為昂貴，並且容量很小，早期的磁芯存儲器價格平均為每比特1美元，而在同一時期，一塊大小僅為1MB的硬盤價格即為761,000美元。且當時的計算機仍舊採用打孔卡來存儲數據，一個最常見的IBM打孔卡只有80列寬，能儲存的數據也極其有限。因此，程序員在編寫程序時需要儘可能的節省存儲空間，以最大程度的降低存儲成本。因此，當時的程序員普遍在編寫程序時採用六位數來存儲時間，只取四位數年份中的後兩位來表示年份，例如，1976年10月23日就會被簡短的存儲為23/10/76或10/23/76。對當時的情況來說，六位數日期表示法有很大的作用，它能夠減小程序的內存需求，並減少一個程序所要佔用的打孔卡卡數。事實上，這種做法在更早之前的製表機時代就已經被使用。在要處理大量日期數據時，六位數日期表示法還能發揮更大的作用。例如，一間擁有一千萬客戶，每個客戶每天交易三次的銀行若要在計算機中存儲一週所有客戶的交易時間，只取兩位數年份能為這家銀行省下60兆字節的存儲空間。後來，隨著科技的發展，到了20世紀70年代，磁芯存儲器的價格逐漸下降到僅為每比特1美分。而同時，具有同樣價格，但尺寸更小且更便於使用的DRAM也開始逐步替代了磁芯存儲器，打孔卡亦被逐漸淘汰，存儲技術的進步和其價格的大幅降低使得存儲空間不再是一個緊迫的問題。在程序中使用六位數日期的必要性也越來越低，但其並沒有就此退出歷史舞臺，出於程序員們的習慣，以及為了保持向上兼容，這一日期表示法被一直沿用下來，即使當時已經有人提出過在這一日期表示法下潛藏的問題，但當時的程序員普遍都認為自己編寫的程序不可能被持續使用到新千年，並沒有理會這些警告。
六位數日期表示法雖然的確在節省存儲空間上發揮出了作用，但這種模糊的表示法也為未來埋下了隱患。人們在日常生活中為了方便有時也會只用兩位數簡稱一個年份，但計算機和人類的區別在於，人類擁有能夠理解並補全前兩位年份數字的能力，但計算機沒有。它們只會讀取被實際寫出來的後兩位年份，無法自行變更沒被實際寫出來的前兩位年份數字。這就導致了一個問題：在六位數日期下，2000年1月1日將會被轉為01/01/00，然而，由於前兩位年份沒被實際寫出來，也就無法進行變更，計算機就會繼續將前兩位默認為“19”，如此一來，就使得計算機會將2000年誤認為1900年，認為被縮寫為“00”的2000年要早於被縮寫為“99”的1999年。這會導致計算機在執行任何涉及到日期的任務時出錯，甚至引發崩潰。例如，醫生要使用一臺計算機為一位出生在2000年的嬰兒計算要為他使用的藥物劑量，若這臺計算機仍舊使用六位數日期表示法，其就會將這位嬰兒誤認為是一位出生在1900年的百歲老人，並對醫生給出一個適用於老年人的藥物劑量，但這個劑量對新生兒來說可能會是致命的。若不對該問題加以修復，諸如此類的故障會在2000年到來時在全球爆發，影響到所有依賴這些有缺陷的計算機運作的基礎設施和軍政機關，導致停電停水、醫療癱瘓、通信終止到導彈誤射等一系列災難性的後果。
此外，2000年問題也會在除2000年1月1日以外的日期造成影響，並且也不止會導致計算機誤判2000年及之後的年份。因為問題的根源是計算機無法變更前兩位的年份數字，其也會導致計算機錯誤判定1900年之前的年份；而一些使用數字99或9999作為文檔終止標記或停止代碼，且仍舊採用兩位數年份表示法的計算機則可能會在1999年9月9日出現故障；另外，一些計算機由於採用了不正確的閏年識別算法，致使其無法將2000年正確識別為閏年，從而導致它們在2000年2月29日、3月1日、12月31日和2001年1月1日出現故障，該問題也屬於2000年問題的範疇之內。其它會致使2000年問題的原因還包括將“19”硬編碼到軟件子程序中、採用可能會致使存儲寄存器填滿從而發生溢出的日期數據類型。

**引起關注**
1958年，當時在IBM工作的Bob Bemer在為耶穌基督後期聖徒教會編寫族譜記錄軟件時意識到了六位數日期寫法的缺陷，他在之後的數十年裡不斷在各處做出對六位數日期寫法缺陷的擔憂，並呼籲人們轉用標準的八位完整日期寫法，但都沒有起到很大的作用。其於1971年在霍尼韋爾計算機期刊上發表了一篇題為《What's the Date？》的文章，建議人們使用ISO 2014標準的規範日期寫法，這被認為是世界上第一篇公開發表的2000年問題警告文章，1979年，他再於雜誌Interface Age發表另一篇文章《Time and the computer》，進一步深入探討了日期表示問題，他在這篇文章中也提到了2000年閏年問題，他還為COBOL添加了PICTURE子句，以允許程序員能夠在程序中使用四位數年份，此後他一直堅持向業界發出警告，直到他在1982年退休。
1993年，美國雜誌《Computerworld》刊登了一篇題為《Doomsday 2000》的文章，這篇文章的作者是加拿大程序員Peter de Jager，他在1977年於IBM上任操作員，在職期間，他意識到兩位數的年份寫法會為未來埋下隱患，並向管理層反饋了這一問題，但同樣也沒有起到作用。1993年，Computerworld的一名編輯在他進行了一場關於個人電腦的演講之後找到他，希望他能就這場演講的主題在Computerworld上發表一篇文章，不過彼得則提議要另寫一篇“真正的問題”，於是便以2000年問題為主題，撰寫了《Doomsday 2000》，這篇文章普遍被認為是引起計算機行業開始關注2000年問題的文章，彼得·德·耶格也因此被認為是將2000年問題帶入行業及大眾視野的人，並在此後作為2000問題專家獲利。
1995年，IBM承認2000問題的存在，並開始向其客戶提供問題的解決服務、工具與支持，而微軟公司的聯合創始人與時任CEO比爾·蓋茨則在1996年7月表示2000年問題只是由“老化的大型機軟件”所導致的，並堅稱微軟的軟件不會受到2000年問題的影響，而後其又於1997年的一次行業峰會上表示對2000年問題的擔憂要歸咎於“喜歡講恐怖故事”的人，直到一年後，微軟才承認他們在2000問題上“反應遲緩”。

**問題的引申**
有些程序可能會免在2000年出現閏日而強行修改計算日期的過程。這些程序如果繼續在將來的閏年使用的話，有可能會導致日期錯亂。
另一方面，對於使用其它曆法的地區，如臺灣的民國紀年或日本的和曆，類似問題也有可能在之後的年份出現。例如：民國100年就在2011年。如果所用的軟件沒有解決兩位年份的問題，那其實只是將兩千年問題從2000年推遲11年後再發生。
對於目前在世界上廣泛用作服務器軟件的Unix系統來講，由於傳統的Unix系統使用32位的整型數表示日期（這個32位數字表示從1970年1月1日起至所存儲日期過去了多少秒），因此在2038年日期將會被捲回，這類似於2000年問題。時間將可能重新從1970年1月1日開始計算，這將可能引起世界範圍的計算機故障。這被稱為2038年問題。
此外，是否存在10000年問題。還是一個遙不可及的問題。

**問題的延續**
展示JavaScript“.getYear()”函數問題的網頁截圖
有觀點認為過了公元2000年之後，「千年蟲」的問題就會自動消失。然而，若然沒有對編程方式作合適的修訂，問題在過了公元2000年依然會出現。以下為兩個在公元2008年曾經出現的千年蟲問題：- 2008年是閏年，所以這一年有2月29日。不過，有相當數量的摩托羅拉舊款手提電話在這一天由於系統無法表示這一日，系統將電話的日期強制重置為2001年1月1日。- 在現代瀏覽器和網頁設計中，如需將年份簡寫為兩位數字，通常直接取年份的最後兩位（如將2021年簡寫為「21」）。但如使用已廢用的JavaScript“.getYear()”函數，利用「把4位年份數字減去1900」的方式來取得兩位年份數字，則會出現“不正常”的結果，例如將2021年顯示為“121”。

**日本平成時代的結束與新千年蟲**
1999年年底，在全世界程序員在為千年蟲問題焦慮的的時候，日本程序員卻靈機一動：如果繼續沿用昭和（1926年開始）年號的話，千年蟲會足足延後25年（延至2025年）。如此之長的時間足夠解決這次的問題了。然而日本在2019年改元為令和時，不但要更改年號，而且昭和時代年號計算的“新千年蟲”（昭和100年）馬上就要來臨（昭和100年問題）。

**參見**
 2038年問題- 10000年問題- 民國百年蟲- 千年蟲騙案

**參考文獻**

**外部連結**
  關於“政府呼籲各界同心協力殲滅千年蟲”的海報date=20181117063242 -  千年蟲與中小企業date=20131019020926 -  鏗鏘集date=20080616020237