Bash - data, trabalhando em torno do bug de 2038 no sistema LINUX de 32 bits

9

Eu escrevi um pequeno script bash que me fez tropeçar no "Bug do ano 2038" . Eu não conhecia esse problema antes e ouso postar a --debugsaída obtida datequando meu script tentou calcular nessa data mágica (03:14:07 UTC em 19 de janeiro 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'

Existe alguma maneira de fazer o GNU datecalcular nessa data?
(em um sistema LINUX de 32 bits)

  Operating System: Debian GNU/Linux buster/sid
            Kernel: Linux 4.12.0-2-686-pae
      Architecture: x86
nath
fonte
3
Uma maneira de contornar isso em sistemas de 32 bits é usando um sistema operacional * BSD.
Rui F Ribeiro
1
@Kusalananda Desculpe por não estar claro. Sim, eu estou perguntando sobre uma maneira de GNU date. Vou editar a minha pergunta ...
Nath
FWIW, o OpenBSD corrigiu isso em 2014 . Foi muito trabalho, mas de alguma forma eles conseguiram corrigir todos os bits relevantes.
Satō Katsura
@RuiFRibeiro Não é exatamente verdade: time_t tem 8 bytes em todas as arquiteturas suportadas, exceto i386 .
Isaac

Respostas:

14

Se você deseja manter o GNU dateno Linux de 32 bits, não há uma maneira fácil de fazê-lo funcionar com datas após 2038. Os coreutilsmantenedores não consideram isso um coreutilsbug , portanto, não espere uma correção lá - a correção terá vir da biblioteca C e do kernel. Se você quiser brincar com o trabalho em andamento, precisará de:

e uma quantidade decente de habilidade e paciência.

Para saber mais sobre como o 2038 foi planejado para ser tratado no mundo Linux de 32 bits, consulte o LWN e a redação do BoF de 2038 no DebConf 17 (com os comentários de acompanhamento lá e no LWN ). Este artigo do LWN de janeiro de 2019 descreve as alterações que estão sendo implementadas no kernel.

Stephen Kitt
fonte