2038年問題(又叫 Unix 千年蟲Y2K38Y2K+38Y2038K)係指 Unix 嘅計時方法嘅電子架生電腦軟硬件喺2038年會發生日子時間計錯嘅問題。

2038年問題示範:第一行係 time_t數值嘅二進制表示;第二行係十進制表示;第三行係領咗嘢嘅電腦出嘅時間;第四行係實際時間

Unix時間計時嘅方法係由一個 「紀元」(epoch)開始逐秒計,爾種計時方法後來寫咗入 POSIX 標準,所以唔淨止 Unix 同類Unix系統,其他嘢都可能用爾種方法計時,爾種計時法嘅好處係轉夏令時間、轉時區都唔使人手校鐘,但係可能搞到一啲軟件2038年出錯。好簡單咁講,因為 Unix 有正負整數(signed integer)卅二時間限制,即係由1970年1月1號0時0分0秒 [1],再過2³¹咁多秒,去到2038年初,日子會跳「返轉頭」,搞到啲軟件唔知係幾時,啲嘢就錯晒。

POSIX 嘅計時方法係用嚟計時間,每秒用一爻(bit)嚟代表。用嚟代表時間嘅資料類型叫 time_t,定義係一個正負整數(signed integer),傳統上有 32 爻咁大,而 time_t = 0⸺即係上面講嘅 「紀元」⸺就規定咗係世界協調時間 1970年1月1號 0時0分0秒。所以,當 time_t = 10001,時間就係 1970年1月1號 1時0分1秒。如似類推,響 2 嘅 31 次方(即係 2147483648)咁多秒之後,所有可以代表正數嘅整數都用晒,2038年1月19號 3點14分07秒就係最後可以代表得到嘅時間。

2147483648 咁多秒之後,個系統就會返轉頭(wrap around),變成 32 爻可以表示最細嘅負數,跳返1901年。令啲程序一要計時間嘅嘢就錯晒,因為佢哋無法將呢個時間識別為2038年。可能產生錯誤嘅計算同錯誤嘅動作。

有一啲系統嘅 time_t 去到 64 爻咁大,呢啲系統如果唔需要處理 32爻嘅 time_t 資料唔會受到影響。

睇埋 編輯

參考 編輯

  1. "The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004 Edition (definition of epoch)". IEEE and The Open Group. The Open Group. 2004. 喺2008-03-07搵到.

連結 編輯