程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 軟件中的2038問題討論

軟件中的2038問題討論

編輯:.NET實例教程
軟件中的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年十二月十三日黑色星期五下午三點四十五分五十二秒。   
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved