Bash - 日期,解决 32 位 LINUX 系统上的 2038 bug

Bash - 日期,解决 32 位 LINUX 系统上的 2038 bug

我写了一个小 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'

有没有办法让 GNUdate计算这个日期?
(在 LINUX 32 位系统上)

  Operating System: Debian GNU/Linux buster/sid
            Kernel: Linux 4.12.0-2-686-pae
      Architecture: x86

答案1

如果您想date在 32 位 Linux 上坚持使用 GNU,则没有简单的方法可以让它处理 2038 年之后的日期。维护者coreutils不认为这是一个coreutils错误,所以不要指望那里有修复 - 修复必须来自C 库和内核。如果您想尝试正在进行的工作,您将需要:

以及相当多的技巧和耐心。

有关计划在 32 位 Linux 世界中处理 2038 年的更多信息,请参阅低水温网络DebConf 17 上 2038 BoF 的报道(其中有后续评论和在LWN上)。2019 年 1 月 LWN 文章描述了内核中正在实现的更改。

相关内容