date - les années antérieures à 1901 sont considérées comme invalides

11

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' dateutilité 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

Jasdeep Singh
la source
Je ne reçois aucune erreur. J'utilise coreutils 8.10, peut-être un vieux bug?
xenoterracide
@xenoterracide êtes-vous un système 64 bits?
Mikel
@Mikel yes, I am
xenoterracide

Réponses:

15

Bonne question.

La documentation indique que cela devrait être autorisé.

 info date 'Date input formats' 'Calendar date items'

Pour les mois numériques, le format ISO 8601 "ANNÉE-MOIS-JOUR" est autorisé, où ANNÉE est un nombre positif, ...

Un zéro de tête doit être présent si un nombre est inférieur à dix.

Si YEAR est 68 ou plus petit, alors 2000 y est ajouté; sinon, si YEAR est inférieur à 100, alors 1900 y est ajouté.

Êtes-vous sur un système 32 bits?

Avez-vous également une erreur avec les dates après le 2038-01-20, par exemple

date -d '2038-01-20'

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 à:

Mikel
la source
Merci Mikel, je crois que je suis sur une machine 32 bits. En fait, je travaille sur un serveur distant et le serveur ne révélera pas beaucoup d'informations, même avec une unamecommande, 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!!
Jasdeep Singh
Oui, i686 est de 32 bits. Heureux de vous aider. Si vous avez besoin d'aide pour gérer des dates plus anciennes, essayez les modules Python et Perl que j'ai suggérés et posez une autre question si vous ne parvenez pas à le faire fonctionner.
Mikel
7

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_MINen 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.

Chris Johnsen
la source