2038年問題

出自維基百科,自由嘅百科全書
跳去: 定向搵嘢
2038年問題示範:第一行係 time_t數值嘅二進制表示;第二行係十進制表示;第三行受影響嘅電腦理解嘅時間;第四行係實際時間

2038年問題(又叫Unix 千年蟲Y2K38Y2K+38Y2.038K)係指因為 Unix 操作系統嘅計時方法而可能搞到一啲軟件2038年出錯。好簡單咁講,因為 Unix 有正負整數卅二時間限制,即係由1970年1月1號0時0分0秒 [1],再過2³¹咁多秒,約莫去到2038年初,日子會跳「返轉頭」,搞到啲軟件唔知係幾時,啲嘢就錯晒。

卅二爻時間限制[編輯]

喺 Unix 系統同埋啲 Unix-like 嘅系統,係用嚟計時間,每秒用一爻(Bit)嚟代表。用嚟代表時間嘅 data type 叫 time_t,喺 Unix 上面,定 time_t 做一個正負整數(signed integer),有 32 爻咁大,有一啲去到 64 爻咁大(係近年 64 bit CPU 出現之後嘅事)。喺 Unix 上面,time_t = 0 規定咗係 1970 年 1 月 1 號 0 時 0 分 0 秒。所以,當 time_t = 10001,時間就係 1970 年 1 月 1 號 1 時 0 分 1 秒。如似類推,響 2 嘅 31 次方(即 2147483648)咁多秒之後,所有可以代表時間嘅整數都用晒,2038 年 1 月 19 號 03 點 14 分 7 秒就係最後可以代表得倒嘅時間。

2147483648咁多秒之後,個系統就會反轉頭,會變成負數,搞到啲軟件唔知係幾時,一要計時間嘅嘢就錯晒。超過此一瞬間,時間將會被掩蓋(wrap around)且在內部被表示為一個負數,並造成程序無法工作,因為它們無法將此時間識別為2038年,而可能會依個別實作而跳回1970年或1901年。錯誤的計算及動作可能因此產生。

-->

點樣搞返掂[編輯]

目前並沒有針對現有的CPU/操作系統搭配的簡單解決方案。直接將POSIX時間更改為64位模式將會破壞對於軟件、數據存儲以及所有與二進制表示時間相關的部份的二進位兼容性。更改成無符號的32位運算器(integer)則會影響許多與時間改變相關的程序。

大部份64位操作系統已經把time_t這個系統變數改為64位寬。不過,其他現有架構的改動仍在進行中,不過預期「應該可以在2038年前完成」。然而,直到2006年,仍然有數以億計的32位系統在運行中,特別是許多嵌入式系統。相對於一般電腦科技18至24個月的革命性更新,嵌入式系統可能直至使用壽命終結都不會改變。32位time_t的使用亦被編碼于文件格式,例如眾所周知的ZIP壓縮格式。其能存在的時間遠比受影響的機器長。

新的64位運算器可以記錄至約2900億年後的292,277,026,596年12月4日15:30:08,星期日(UTC)。

參考[編輯]

連結[編輯]