Linux
Bash - 日期,解決 32 位 LINUX 系統上的 2038 錯誤
我寫了一個小 bash 腳本,讓我偶然發現了“2038 年錯誤”。我以前不知道這個問題,我只是敢於發布我的腳本試圖計算這個神奇日期(2038 年 1 月 19 日 03:14:07 UTC)時
--debug
得到的輸出。date
date -d "20380119"
date: parsed number part: today/this/now date: input timezone: +01:00 (set from system default) date: warning: using midnight as starting time: 00:00:00 date: starting date/time: '(Y-M-D) 2038-01-19 00:00:00 TZ=+01:00' date: '(Y-M-D) 2038-01-19 00:00:00 TZ=+01:00' = 2147468400 epoch-seconds date: output timezone: +01:00 (set from system default) date: final: 2147468400.000000000 (epoch-seconds) date: final: (Y-M-D) 2038-01-18 23:00:00 (UTC0) date: final: (Y-M-D) 2038-01-19 00:00:00 (output timezone TZ=+01:00) Tue Jan 19 00:00:00 CET 2038
date -d "20380119 + 1 days"
date: parsed hybrid part: +1 day(s) date: input timezone: +01:00 (set from system default) date: warning: using midnight as starting time: 00:00:00 date: starting date/time: '(Y-M-D) 2038-01-19 00:00:00 TZ=+01:00' date: warning: when adding relative days, it is recommended to specify 12:00pm date: error: adding relative date resulted in an invalid date: '(Y-M-D) 2038-01-20 00:00:00 TZ=+01:00' date: invalid date '20380119 + 1 days'
date -d "20380120" --debug
date: parsed number part: today/this/now date: input timezone: +01:00 (set from system default) date: warning: using midnight as starting time: 00:00:00 date: error: invalid date/time value: date: user provided time: '(Y-M-D) 2038-01-20 00:00:00 TZ=+01:00' date: normalized time: '(Y-M-D) 2038-01-20 00:00:00 TZ=+01:00' date: date: possible reasons: date: numeric values overflow; date: missing timezone date: invalid date '20380120'
有什麼方法可以讓 GNU
date
在此日期內進行計算?(在 LINUX 32 位系統上)
Operating System: Debian GNU/Linux buster/sid Kernel: Linux 4.12.0-2-686-pae Architecture: x86
如果你想在 32 位 Linux 上堅持使用 GNU
date
,沒有簡單的方法讓它在 2038年之後工作。coreutils
維護者不認為這是一個coreutils
錯誤,所以不要指望那裡有修復——修復將會有來自C 庫和核心。如果你想玩弄正在進行的工作,你需要:
- Arnd Bergmann 的核心更新檔(從 5.1 版核心開始,大部分已合併或接近合併),
- Albert Aribaud 的
glibc
更新檔(基於此處概述的設計),以及相當的技巧和耐心。
有關計劃在 32 位 Linux 世界中處理 2038 的方式的更多資訊,請參閱LWN和DebConf 17 上 2038 BoF 的文章(以及那里和LWN 上的後續評論)。這篇 2019 年 1 月的 LWN 文章描述了核心中正在實施的更改。