軟件中的2038問題討論
摘自delphi園地 http://www.Delphifans.com/InfoVIEw/Article_4573.Html
在談論2038問題時,我們要知道,並不是wonderware軟件會有2038問題,基本上所有的軟件(跟時間有關),從大規模的ERP、MES到自動化組態軟件、辦公軟件、聊天軟件,從大型工作站到我們用的手機通訊都可能會出現2038問題,所以我們不要太驚慌,但也不能回避。
資料中顯示Y2038 bug將於2038年1月19日(星期二)03:14:07am(GMT)正式爆發,屆時人們對千年蟲問題的預言可能將一一實現,比如手機網絡工作不正常,衛星脫離軌道,型號較老的電腦軟件軟硬件無法正常工作等。
什麼是Y2038 bug Time_t是C/C++等編程語言在內部代表/存儲日期和時間的一種數據類型。Time_t實際上是一個代表秒數的整數,當它的值為0時,代表的時間是1970年1月1日12:00:00;當Time_t=60時,則表示1970年1月1日12:01:00,依此類推。
所有32位電腦系統都用帶符號32位整型來存儲time_t的值,也就是說t_time只能用31位二進制數來表示(第一位用來表示正負號),而其最大值轉換為十進制是2147483647,換算成日期和時間剛好是2038年1月19日03:14:07am(GMT),而這一秒過後,t_time的值將變成-2147483647,代表的是1901年12月13日8:45:52pm,這樣32位軟硬件系統的日期時間顯示就都亂套了。另外,無法接受time_t為負值的其他功能也將返回錯誤。
舉個實際的例子來說,登陸上Yahoo messenger,給好友發個消息,恩沒問題,現在把系統時間更改為2038年1月19日03:14:07am,此時如果再發消息Yahoo messenger就將崩潰。
為何擔憂? 也許有人覺得2038年還早著,無需擔心這個問題。不幸的是,上世紀60年代的程序開發人員也抱有類似的錯誤想法,並由此導致了Y2K問題,給全球IT頁帶來數十億美元的損失。
要知道時間對於許多電腦程序來說都非常重要,操作系統、數據庫程序、電子表格軟件、實時控制系統等無不涉及到時間。因此我們必須在Y2038 bug爆發前做好充足的准備。
盡管到2038年,桌面PC和服務器基本上都將升級到64位甚至128位,但仍會有許多使用中的32位甚至更古老的系統。即使是在32位系統盛行的今天,大多數嵌入式系統仍是8位或16位的,而小型嵌入式系統的數量其實比台式機更多。
如何應對? Y2038問題和Y2K一樣難纏,其中一種解決辦法就是用位數更多的數據類型來存儲日期和時間。如果使用64位數據類型,time_t最大可以表示公元292000000000年,是宇宙估計年齡的20倍,最起碼看到這篇文章的各位都不會再遇到什麼YXXXX問題了。
目前對於Y2038 bug的影響有多大還存在爭論,但有一點可以肯定的是:有備無患。相信我們能像克服Y2K問題那樣圓滿解決Y2038問題。
有人把2038問題稱作“千年蟲二世”,這個比喻非常恰當。
用32位元來記錄時間,正值表示為1970以後,負值則表示1970年以前。我們可以很簡單地計算出其時間領域:
2^31/86400(s) = 24855.13481(天) ~ 68.0958(年)
1970+68.0958 = 2038.0958
1970-68.0958 = 1901.9042
時間領域為[1901.9042,2038.0958]。
准確的時間為2038年一月十八日星期一晚上十點十四分七秒。那一刻,時間將會轉為負數,變成1901年十二月十三日黑色星期五下午三點四十五分五十二秒。