Bash - date, contourne le bug 2038 sur le système LINUX 32 bits

9

J'ai écrit un petit script bash qui m'a fait tomber sur le "bug de l'an 2038" . Je ne connaissais pas ce problème auparavant et j'ose juste publier la --debugsortie que j'ai obtenue datelorsque mon script a essayé de calculer à travers cette date magique (03:14:07 UTC le 19 janvier 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-t-il un moyen de faire datecalculer GNU sur cette date?
(sur un système LINUX 32 bits)

  Operating System: Debian GNU/Linux buster/sid
            Kernel: Linux 4.12.0-2-686-pae
      Architecture: x86
nath
la source
3
Une façon de le contourner dans les systèmes 32 bits est d'utiliser un système d'exploitation * BSD.
Rui F Ribeiro
1
@Kusalananda désolé de ne pas être clair. Oui, je demande un moyen pour GNU date. Je vais modifier ma question ...
nath
FWIW, OpenBSD a corrigé cela en 2014 . C'était beaucoup de travail, mais d'une manière ou d'une autre, ils ont réussi à patcher tous les bits pertinents.
Satō Katsura

Réponses:

14

Si vous voulez vous en tenir à GNU datesur Linux 32 bits, il n'y a pas de moyen facile de le faire fonctionner avec des dates après 2038. Les coreutilsresponsables ne considèrent pas cela comme un coreutilsbug , alors ne vous attendez pas à un correctif - le correctif aura à venir de la bibliothèque C et du noyau. Si vous voulez jouer avec le travail en cours, vous aurez besoin de:

et une quantité décente de compétence et de patience.

Pour en savoir plus sur la manière dont 2038 devait être géré dans le monde Linux 32 bits, voir LWN et la rédaction du BoF 2038 à DebConf 17 (avec les commentaires de suivi là-bas et sur LWN ). Cet article LWN de janvier 2019 décrit les modifications qui sont en cours d'implémentation dans le noyau.

Stephen Kitt
la source