Bash-日期,在32位LINUX系统上解决2038错误


9

我写了一个小小的bash脚本,使我偶然发现了“ 2038年错误”。我以前不知道这个问题,我只是敢发布我的脚本试图在这个不可思议的日期(2038年1月19日的UTC:14:07)进行计算时--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

3
在32位系统中解决此问题的一种方法是使用* BSD OS。
Rui F Ribeiro


1
@Kusalananda很抱歉,不清楚。是的,我在问GNU的方法date。我将编辑我的问题…
nath

FWIW,OpenBSD 在2014年修复了该问题。这是很多工作,但是他们设法以某种方式修补了所有相关位。
桂桂聪(SatōKatsura)

Answers:


14

如果您要date在32位Linux上坚持使用GNU ,没有简单的方法可以使它在2038 coreutilscoreutils之后的日期上使用。维护人员不认为这是一个错误,因此不要指望在那里进行修复-该修复将来自C库和内核。如果您想进行中的工作,则需要:

以及足够的技巧和耐心。

有关计划在32位Linux世界中处理2038的方式的更多信息,请参见LWNDebConf 17上2038 BoF的文章(在此以及LWN上的后续评论)。2019年1月的LWN文章描述了内核中正在实现的更改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.