人氣點閱:12735 |
發表人 |
2038 年 Overflow 問題簡單摘要 & 解決方式/解法 (2038/01/19) 2014-05-22 16:20 分類: ✔️ifdef ✔️endif 個人: ✔️ifdef ✔️endif |
/ / /
|
|
UNIX TIME Overflow 2038 年問題簡單摘要 & 解決方式/解法
1. POSIX 標準 Unix time_t 是用 singled LONG
=> Linux/BSD/... 泛 UNIX 系統,目前都是這樣實做。
2. @ 64-bit Linux/Unix/BSD 這沒什麼問題
=> 9,223,372,036,854,775,808 秒 (2^64 / 2)
=> 約 292,471,208,677 年
3. @ 32-bit Linux/Unix/BSD 問題就來了
=> 2^32 / 2 = 4,294,967,296 / 2 = 2,147,483,648
=> 2,147,483,648 秒 => 約 68.09 年!
也就是從 1970/1/1 00:00:00 開始,到 2038/1/19 這一天系統時間就會錯誤,
變成又從 1970/01/01 00:00:00 開始
這和當初 1999 -> 2000 的「Y2K問題」,以及民國 99 -> 100 的「民國一百」問題很像
也就是用來儲存時間的欄位,2038 年會爆掉。
有人可能會問,
『現在 (2014) 離 2038 還有 24~25 年,到時候說不定 128bit 系統都普及了!』
不過要記住,很多
「現在設計的系統」「現在打上去的衛星」「現在設計的核電廠」「長期使用的銀行系統」
「今年設計的飛機 / 船隻」,他們的壽命通常是 25 ~ 50 年以上!
如果為了穩定、相容性等等因素考量,
很可能還是用 32-bit UNIX like OS / 32-bit Libraries / 32-bit chip (e.g. RTC real-time-clock) 等等
難免就會遇到此問題。
==============================================
解決方式:
1. 從現在開始慢慢使用 64-bit CPU/Chip/OS/Lib/Apps/FileSystem 設計部署你的系統。
2. 如果你的系統還沒上線,請做詳細 2038 年測試 ("Year 2038 Compliant Test") 。
3. 如果你的系統是自己從頭設計,
為了相容性,「metadata, data structure, database 等請勿使用 time_t」,
這很容易導致誤解和相容性錯誤,建議一律用「u64 or s64」!
4. 將你的系統做 19xx 年的判斷(前提是:假設你的系統沒有 19xx 年前的資料!)
例如:這個系統沒有 1980/12/31 以前的交易資料(這應該很可能),
所以可以多了約 10 年的緩衝
也就是大概是這樣子,看到 overflow 的數字,直接當成 2038/01/19 + Offset
1970/01/01 ==> 2038/01/20
1970/01/02 ==> 2038/01/21
1970/01/03 ==> 2038/01/22
...
pseudo code:
代碼:
u64 check_and_remedy_timestamp(time_t __this_year_timestamp)
{
u64 __precise_timestamp = __this_year_timestamp;
#ifdef CONFIG_2038_REMEDY
if (__this_year_timestamp <= str_to_timestamp("1980/12/31"))
{
__precise_timestamp = do_some_timestamp_remedy(__this_year_timestamp);
}
return __precise_time;
#endif /* CONFIG_2038_REMEDY */
return __precise_time;
}
5. 如果你無法變更你的系統,
或者根本沒有能力(或者時間)判斷、測試是否有此問題,
則請於 2038 年之前,慢慢淘汰您的系統! 然後您的新系統,必須符合第一點。
6. Q: Windows Server 使用者有 2038 年的問題嗎?
Ans: 不用擔心,NT Kernel 在十幾年前就用 64-bit 當成 timestamp,雖然單位是 100 nano seconds,
也大約要到西元 2184 年才會爆炸。
7. Q: Mac Server 使用者有 2038 年的問題嗎?
Ans: 不用擔心,有人實測過。 http://blog.interlinked.org/misc/2038.html
________________
美術插畫設計案子報價系統 v0.1 Beta
爪哇禾雀
|
|
Type
繪圖畫廊 設計藝廊 攝影相簿 留言板 最愛收藏 分類標籤
暱稱: Type 註冊: 2002-11-30 發表: 11182 來自: vovo2000.com
V幣: 901800
|
|
|
Re: 2038 年 Overflow 問題簡單摘要 & 解決方式/解法 (2038/01/19) 2014-08-07 19:30 |
/ / /
|
|
Linux Kernel 3.17 (@ 2014) 的 2038 年解法
增加一個 timespec64 structure, 其中 tv_sec 使用 time64_t (64-bits)
代碼:
struct timespec {
__kernel_time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
struct timespec64 {
time64_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
________________
美術插畫設計案子報價系統 v0.1 Beta
爪哇禾雀
|
|
Type
繪圖畫廊 設計藝廊 攝影相簿 留言板 最愛收藏 分類標籤
暱稱: Type 註冊: 2002-11-30 發表: 11182 來自: vovo2000.com
V幣: 901800
|
|
|
|
|
|
|
|
|