Bash-Date, um den 2038-Fehler auf dem 32-Bit-LINUX-System herum

9

Ich habe ein kleines Bash-Skript geschrieben, das mich über den "Year 2038 Bug" stolpern ließ . Ich wusste vorher nichts über dieses Problem und wage es nur, die --debugAusgabe zu veröffentlichen, die ich erhalten habe, dateals mein Skript versucht hat, über dieses magische Datum (03:14:07 UTC am 19. Januar 2038) zu berechnen.

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'

Gibt es eine Möglichkeit, GNU dateüber dieses Datum hinweg berechnen zu lassen ?
(auf einem LINUX 32-Bit-System)

  Operating System: Debian GNU/Linux buster/sid
            Kernel: Linux 4.12.0-2-686-pae
      Architecture: x86
nath
quelle
3
Eine Möglichkeit, dies in 32-Bit-Systemen zu umgehen, ist die Verwendung eines * BSD-Betriebssystems.
Rui F Ribeiro
1
@Kusalananda Entschuldigung für die Unklarheit. Ja, ich frage nach einem Weg für GNU date. Ich werde meine Frage bearbeiten ...
nath
FWIW, OpenBSD hat das im Jahr 2014 behoben . Es war viel Arbeit, aber irgendwie gelang es ihnen, alle relevanten Teile zu patchen.
Satō Katsura

Antworten:

14

Wenn Sie GNU haften mögen dateauf 32-Bit - Linux, gibt es keine einfache Möglichkeit , es zu Arbeit mit Terminen nach 2038 erhalten Die coreutilsMaintainer tut dies ein nicht als coreutilsFehler , also nicht einen Fix es erwarten - das Update wird aus der C-Bibliothek und dem Kernel kommen. Wenn Sie mit der laufenden Arbeit herumspielen möchten, benötigen Sie:

und eine anständige Menge an Geschick und Geduld.

Weitere Informationen darüber, wie 2038 in der 32-Bit-Linux-Welt gehandhabt werden soll, finden Sie in LWN und in der Beschreibung des 2038 BoF auf der DebConf 17 (mit den nachfolgenden Kommentaren dort und zu LWN ). Dieser LWN-Artikel vom Januar 2019 beschreibt die Änderungen, die im Kernel implementiert werden.

Stephen Kitt
quelle