大膽預(yù)測(cè)2038年電腦公司問題始末
現(xiàn)在,由于受到媒體的廣泛關(guān)注,2000年問題已經(jīng)為大多數(shù)人所理解。
大多數(shù)以C編程語言編寫的程序基本不再受2000年問題的影響,但又受到了2038年問題的困擾。出現(xiàn)此問題的原因是,大多數(shù)C程序都使用稱為標(biāo)準(zhǔn)時(shí)間庫的例程庫。這個(gè)庫建立了一套用于存儲(chǔ)時(shí)間值的標(biāo)準(zhǔn)4字節(jié)格式,并提供了用于轉(zhuǎn)換、顯示和計(jì)算時(shí)間值的大量函數(shù)。
標(biāo)準(zhǔn)4字節(jié)格式假定:時(shí)間開始于1970年1月1日中午12:00:00。那一刻的時(shí)間值為0,任何時(shí)間/日期值都以該零值之后經(jīng)過的秒數(shù)來表示。所以,值919642718表示1970年1月1日中午12:00:00之后經(jīng)過了919,642,718秒,即太平洋時(shí)間(美國(guó))的1999年2月21日星期日的16:18:38。這是一種方便的格式,因?yàn)橹灰獙芍迪鄿p,您就可以得到代表它們之間時(shí)間差的秒數(shù)。然后,您可以使用庫中的其他函數(shù)來確定這兩個(gè)時(shí)間之間相差多少分/小時(shí)/天/月/年。
如果讀過位與字節(jié)一文,您就會(huì)知道,帶有正負(fù)符號(hào)的4字節(jié)整數(shù)能夠表示的最大值是2,147,483,647,這就是2038年問題的源頭。在反轉(zhuǎn)成負(fù)值(因而無效)之前,時(shí)間的最大值是2,147,483,647,轉(zhuǎn)換過來就是2038年1月19日。在那一天,任何使用標(biāo)準(zhǔn)時(shí)間庫的C程序都將開始遇到日期計(jì)算方面的問題。
幸運(yùn)的是,在大型機(jī)上,這個(gè)問題的解決要比2000年問題略微容易一些。編寫規(guī)范的程序只需使用新版本的庫(例如,使用8字節(jié)值的存儲(chǔ)格式)重新編譯一次就可以了。之所以能夠這樣解決此問題,是因?yàn)閹鞂⒄麄€(gè)時(shí)間活動(dòng)和自己的時(shí)間類型與函數(shù)封裝在一起。這與多數(shù)大型機(jī)程序不同,那些程序沒有對(duì)自己的時(shí)間格式或計(jì)算進(jìn)行標(biāo)準(zhǔn)化。所以,解決2038年問題就不會(huì)像解決2000年問題那么困難了。
一位思維敏捷的讀者善意地指出,IBM PC硬件會(huì)受到2116年問題的困擾。對(duì)于PC機(jī)來說,時(shí)間開始于1980年1月1日,并以無正負(fù)符號(hào)的32位整數(shù)的形式按秒遞增,這與UNIX時(shí)間非常類似。到2116年,這個(gè)整數(shù)將溢出。
Windows NT使用64位整數(shù)來計(jì)時(shí)。但是,它使用100納秒作為增量單位,且時(shí)間開始于1601年1月1日,所以NT將遇到2184年問題。
蘋果公司聲明,Mac在29,940年之前不會(huì)出現(xiàn)時(shí)間問題!
評(píng)論