✔ 最佳答案
何謂「千年蟲」
千 年 蟲 問 題 乃 源 自 電 腦 處 理 年 份 的 方 法 。 由 於 電 腦 發 展 初 期 極 為 昂 貴 , 而 且 記 憶 容量 較 低 , 所 以 為 了 增 加 效 率 及 容 量 , 便 將 年 份 的 四 位 數 字 簡 化 至 二 位 數 字 , 例 如 以 '99' 代 替 1999年 。 因 此 , 當 2000年 被 簡 化 為 '00' 時 , 電 腦 可 能 會 誤 認 這 是 1900 而 非 2000年 。 若 不 解 決 此 問 題 , 有 關 日 期 的 數 據 、 計 算 、 比 較 、 排 序 就 可 能 出 錯 。此 電 腦 故 障 被 稱 為 「 千 年 蟲 」 。 千 年 蟲 問 題 不 但 存 在 於 電 腦 軟 件 中 , 它 還 存 在 於 內置 微 處 理 器 的 設 備 和 儀 器 中 , 影 響 之 廣 , 從 家 居 的 電 子 產 品 以 至 汽 車 、 醫 療 及 保 安系 統 、 通 訊 產 品 等 , 可 謂 無 處 不 在 , 更 直 接 影 響 您 的 日 常 生 活 。 而 在 商 業 應 用 方 面, 由 於 電 腦 上 的 失 誤 , 更 可 能 導 致 財 務 或 賬 目 偏 差 。
千年蟲之所以引發到廣泛的關注,其原因是千年蟲的影響絕不止於電腦的應用,它的影響小至一部家居的錄影機,大至一架空中巴士的操控問題也會涉及。只因現今科技一日千里,電腦的應用可以說是無處不在......在1997年,全世界開始關注「千年蟲」這個問題。所謂的千年蟲危機,是指電腦在邁入下一個世紀時,是否能夠:
正確辨識公元2000年及之後的年份,而不會誤識為是1900年或1980年 或1984年或其他的年份?
正確地運算和處理公元2000之後的閏年(二月份含 29 天的年份)?
這個問題會在我們以兩位數來表示年份時產生。
邏輯運算 數學計算
四位數 兩位數 四位數 兩位數
1998 > 1997 98 > 97 1998 - 1997 = 1 98 - 97 = 1
2001 > 1999 01 < 99 2001 - 1999 = 2 01 - 99 = -98
** 兩位數的年份計算,在公元2000年後會產生與四位數計算迥然不同的邏輯或數學計算結果。
此外,某些程式可能將「00」、「99」等年份賦予特殊意義,比如在某程式中「00」 表示「未知年份的資料」,「99」表示「永不刪除的資料」,那麼到了1999年 和2000年,這類程式由於邏輯上的錯亂而產生了我們預期不到的結果。
千年蟲存在的原因
在以往,電腦的記憶體以及儲存配備價格昂貴,直到近年才大幅調低 。 因此,為了節省空間,很多關於「年份」的儲存與計算都只取最後的兩位數,也就是將「1998」年寫成「98」,而略去前面記錄世紀的兩位數。人們在日常生活習慣上也常以兩位數來表示年份。可是到了公元2000年的時候,當年份前兩位記錄「世紀」的數字轉換,而後兩位數字歸零時,便可能會引發「千年蟲危機」了...
只記錄「年份」 記錄「世紀」和「年份」
MMDDYY MMDDYYYY
083198 08311998
** 使用兩位數記錄年份可以節省 2/8 = 25% 的儲存空間
千年蟲危機會到了公元2000年才發作嗎?答案是否定的,因為程式的運算中可能包含涉及未來時間的運算。比如說:一項為期三年的分期付款計畫的利息計算公式中,也許會有「三年後」的年份出現。許多類似涉及未來時間運算的場合,都可能在公元 2000來臨之前就已經出問題了!
對電腦而言,會受千年蟲影響的地方
主機板上的 Real Time Clock (RTC) 晶片
這是大多數系統中,電腦時鐘資訊的最原始來源。RTC 靠主機板上的電池維持運作, 無論電腦正在使用中或被關掉電源都會一直運作。市面上的 RTC 晶片多以 BCD (即 Binary Coded Decimal) 方式來儲存日期與時間。據了解,市面上的 RTC 多以兩位數來儲存「年份」,另有兩位數儲存「世紀」。可是測試結果顯示目前大多數的 RTC 到了公元2000年時並不會自動更換其「世紀」欄位,也就是目前全世界大多 數電腦的 RTC 都經不起千年蟲的考驗。不過不用擔心,此問題多可通過 BIOS 層面 來解決。
電腦的 BIOS 和 CMOS 時間
除了少數工作站擁有本身獨立運算的 BIOS 時間之外,大多數電腦的 BIOS 和 CMOS 時間都取自 RTC。因此,即使 BIOS 本身能夠處理自己的千年蟲問題但不能察覺來自 RTC 的千年蟲危機的話,還是會功虧一簣的。目前大多數 BIOS 廠商的已推出 Y2K Compliant 的 BIOS。所謂的 Y2K Compliant BIOS,其對於處理千年蟲問題的主要 措施有:
確保本身從 1900 年至 2035 年的日期處理與運算都沒有問題。
能夠察覺來自 RTC 的千年蟲問題並自行修正以免本身的時鐘受影響。
作業系統的時間
作業系統本身的時鐘多是參考自 BIOS 的時間。只要 BIOS 能夠處理 好千年蟲問題,目前一般作業系統如 Windows 98、Unix、Mac OS 等的時間,理論 上應該不會受到千年蟲的影響。
作業系統的 shell
作業系統的時鐘本身也許沒有問題,但問題卻可能由於作業系統的 shell 層次 在時間的處理方面有瑕疵而產生。比如說:Windows 95 的 command.com 和某些 Unix 版本的 ksh 就已經發現問題了。廠商也紛紛推出了補救的 fix 檔,多可從他們的網站下載。(日期為 1998 年 3 月 23 日的 command.com 是 Win 95 的 fix 檔之一)
產生應用程式的編譯軟體及其函式庫
大多數應用程式皆由編譯軟體 (compiler) 編譯成可以直接使用的執行檔。假如有關 編譯軟體所提供的 library function 或 routine 不能處理千年蟲問題,那麼所產生 的應用程式除非自行解決,否則就會連帶受到影響了。以微軟的 Visual Basic 來講, VB 3.0 的 library 是有問題的,而 VB 5.0 的 library 則沒問題。
應用程式本身的運算邏輯
這牽涉到程式設計者在編寫程式時是否有考慮千年蟲的問題。如果程式只以兩位數來 運算以及儲存日期資料的話,那這個程式就很有可能會受千年蟲影響了。
資料儲存的格式
儲存在資料庫 (如 dbf、mdb、...) 或試算表 (如 xls、wk1、...) 裡面的日期資料的儲存格式,是否有將「世紀」的資訊也存進去呢?如果是以 short date 或其他沒有「世紀」資訊的格式儲存,那麼使用它的應用程式如果無法辨認有關日期是屬於哪一個世紀的話,問題就來了...
各層次千年蟲危機的解決方法
層次 解決方案
Real Time Clock 可通過 Y2K Compliant BIOS 來解決。
BIOS 和 CMOS (治本) 更新 flash BIOS 程式或更換主機板。
(治標) 在 autoexec.bat 執行日期修正程式。
作業系統 從廠商處取得 fix/patch 補救或更換至新版本。
應用程式 修改程式或換用另一套沒問題的程式。
資料庫和試算表 修改程式加入適當判斷或想辦法 update 資料檔。
修正千年蟲危機的技術 重寫系統 (Rewrite)
有些比較老舊的系統可能會藉由整個重寫來解決問題,順便採用當前新的技術與 操作方式來取代舊的,如從 DOS 環境轉換至 Windows 環境。重寫系統往往比修補 舊系統更省錢、省時、省力。比較麻煩的工作是轉換舊系統使用中的龐大資料庫和 各項資料檔案以便能夠在新系統中延續使用。
擴充 (Expansion)
將原本只有兩位數的「年份」欄位擴充成四位數。此舉很可能需要更動資料檔案的 結構。
估算 (Windowing)
在程式中作出假設,某一年之後的年份當是前一個世紀的來處理,之前的就當是後一個世紀的來處理。比如說我們以 30 作為分界點,則如果日期中「年份」欄位 呈「50」,我們就當成是「1950」,如果是「25」,則當成是「2025」,因為 25 小過於 30。
減值 (Decrementing)
有沒有發覺我們的日曆每 28 年就會完完整整地重覆呢?也就是說,如果今天是星期一, 那麼 28 年前的今天也會是星期一。我們可以利用這個週期特性,在運算時將所有的 日期減 28 或 28 的倍數(如 56),運算完後再加回 28 即可。這個取巧方法已被證實是可行的,問題是一旦涉及日期運算就要轉來轉去,甚為麻煩。