Bash - fecha, trabajando alrededor del error 2038 en el sistema LINUX de 32 bits

9

Escribí un pequeño script de bash que me hizo tropezar con el "Error del año 2038" . No conocía este problema antes y me atrevo a publicar el --debugresultado que obtuve datecuando mi script intentó calcular a través de esta fecha mágica (03:14:07 UTC el 19 de enero de 2038).

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'

¿Hay alguna forma de hacer que GNU datecalcule en esta fecha?
(en un sistema LINUX de 32 bits)

  Operating System: Debian GNU/Linux buster/sid
            Kernel: Linux 4.12.0-2-686-pae
      Architecture: x86
nath
fuente
3
Una forma de evitarlo en los sistemas de 32 bits es usar un * BSD OS.
Rui F Ribeiro
1
@Kusalananda lo siento por no estar claro. Sí, estoy preguntando por un camino para GNU date. Editaré mi pregunta ...
nath
FWIW, OpenBSD arregló eso en 2014 . Fue mucho trabajo, pero de alguna manera lograron parchar todos los bits relevantes.
Satō Katsura
@RuiFRibeiro No es exactamente cierto: time_t es de 8 bytes en todas las arquitecturas compatibles, excepto i386 .
Isaac

Respuestas:

14

Si desea apegarse a GNU dateen Linux de 32 bits, no hay una manera fácil de hacerlo funcionar con fechas posteriores a 2038. Loscoreutilscoreutils encargados del mantenimiento no consideran que esto sea un error , así que no espere una solución allí; la solución tendrá para venir de la biblioteca C y el núcleo. Si quieres jugar con el trabajo en progreso, necesitarás:

y una buena cantidad de habilidad y paciencia.

Para obtener más información sobre la forma en que se planeó manejar 2038 en el mundo Linux de 32 bits, consulte LWN y la descripción del 2038 BoF en DebConf 17 (con los comentarios de seguimiento allí y en LWN ). Este artículo de LWN de enero de 2019 describe los cambios que se están implementando en el kernel.

Stephen Kitt
fuente