Bash - data, obejście błędu 2038 w 32-bitowym systemie LINUX

9

Napisałem mały skrypt bashowy, który sprawił, że natknąłem się na „Bug 2038 roku” . Nie wiedziałem wcześniej o tym problemie i po prostu ośmielam się opublikować --debugwyniki, które otrzymałem, datekiedy mój skrypt próbował obliczyć dla tej magicznej daty (03:14:07 UTC 19 stycznia 2038 r.).

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'

Czy jest jakiś sposób, aby GNU dateobliczył tę datę?
(w systemie 32-bitowym LINUX)

  Operating System: Debian GNU/Linux buster/sid
            Kernel: Linux 4.12.0-2-686-pae
      Architecture: x86
nath
źródło
3
Jednym ze sposobów obejścia tego w systemach 32-bitowych jest użycie * BSD OS.
Rui F Ribeiro
1
@Kusalananda przepraszam, że jestem niejasny. Tak, pytam o sposób na GNU date. Zmienię moje pytanie ...
nath
FWIW, OpenBSD naprawił to w 2014 roku . To było dużo pracy, ale jakoś udało im się załatać wszystkie odpowiednie elementy.
Satō Katsura,

Odpowiedzi:

14

Jeśli chcesz trzymać się GNU datena 32-bitowym Linuksie, nie ma łatwego sposobu, aby działał z datami po 2038 roku .coreutilscoreutils Opiekunowie nie uważają tego za błąd , więc nie oczekuj tam poprawki - poprawka będzie miała pochodzić z biblioteki C i jądra. Jeśli chcesz pobawić się trwającymi pracami, potrzebujesz:

i przyzwoitą umiejętność i cierpliwość.

Więcej informacji o sposobie obsługi 2038 w 32-bitowym świecie Linuksa można znaleźć w LWN i opisie BoF 2038 na DebConf 17 (z komentarzami tam i na LWN ). W artykule LWN ze stycznia 2019 r. Opisano zmiany, które są wdrażane w jądrze.

Stephen Kitt
źródło