J'ai installé la date (GNU coreutils) 7.1 sur mon système.
Si j'essaie de vérifier les dates antérieures au 14 décembre 1901, j'obtiens une erreur "date invalide". Par exemple,
$ date -d 1901-12-13
date: invalid date `1901-12-13'
$ date -d 1901-12-14
Sat Dec 14 00:00:00 EST 1901
Que dois-je faire pour que l' date
utilité de traiter les années antérieures à 1901 soit valide?
Je reçois des erreurs similaires pour les dates postérieures au 19 janvier 2038
shell-script
date
Jasdeep Singh
la source
la source
Réponses:
Bonne question.
La documentation indique que cela devrait être autorisé.
Êtes-vous sur un système 32 bits?
Avez-vous également une erreur avec les dates après le 2038-01-20, par exemple
Si c'est le cas, il semble que la date GNU utilise une valeur de temps de 32 bits.
Je ne sais pas comment résoudre ce problème autrement qu'en utilisant un système 64 bits ou en utilisant un outil différent, par exemple DateTime en Perl ou datetime en Python.
Quelques antécédents:
Les temps Unix comptent le nombre de secondes à partir du 1er janvier 1970 en utilisant une valeur entière. Si le système utilise des entiers 32 bits, il ne peut compter que 2,1 milliards de secondes en avant (jusqu'au 2038-01-19 03:14:02 UTC) et 2,1 milliards de secondes en arrière (retour au 1901-12-13 20:45:52 UTC).
Plus d'informations à:
la source
uname
commande, sauf le fait qu'il dit que c'est une machine i686, que je suppose être des machines 32 bits. Quant au problème 2038, oui, ce problème est là en fait dans le serveur distant. Encore merci pour votre contribution! Très appréciée!!Votre système (ou au moins cette version de la date ) utilise probablement une valeur d'heure interne 32 bits.
L'époque Unix (valeur de temps zéro) est 1970-01-01 00:00:00 UTC. Ce point de départ place 1901-12-13 00:00 EST juste en dehors de la plage d'une valeur de temps 32 bits signée.
1901-12-14 00:00:00 EST est -2147454000
1901-12-13 15:45:52 EST est -2147483648 (alias
INT_MIN
en C, l'entier signé minimum de 32 bits)1901-12-13 00:00: 00 EST est -2147540400
Vous pouvez essayer d'utiliser 1901-12-13 15:45:52 EST. Cela devrait fonctionner, mais une seconde plus tôt échouera probablement de la même manière que 1901-12-13 00:00.
la source