web-dev-qa-db-fra.com

Comment représenter des dates avant Epoch comme horodatage UNIX

Il m'est venu à l'esprit que je ne suis pas au courant d'un mécanisme pour stocker les dates avant janvier 1970. 1 comme horodatage Unix. Comme cette date est "l'époque" d'Unix, ce n'est pas vraiment une surprise.

Mais - même s'il n'est pas conçu pour cela - je souhaite tout de même stocker les dates du passé au format Unix.
J'en ai besoin pour des raisons.

Ma question est donc la suivante: comment faire pour que les horodatages Unix contiennent des dates "invalides" mais toujours opérationnelles? Est-ce que le stockage d'un nombre négatif de secondes fonctionnerait? Pouvons-nous même stocker négatif quantités de secondes dans un horodatage Unix? Je veux dire, n'est-ce pas non signé?

De plus, si je ne me trompe pas, je ne pouvais stocker des dates que 1901. dec. 13 20:45:52 cela pourrait-il être étendu plus loin dans l'histoire par quelque moyen que ce soit?

26
Wolfer

nix Time est généralement un nombre de 32 bits de secondes entières à partir du premier moment de 1970 en UTC, le Epoch étant 1 January 1970 00:00:00 UTC. Cela signifie une gamme d'environ 136 ans avec environ la moitié de chaque côté de l'époque. Les nombres négatifs sont plus tôt, zéro est l'époque et les positifs sont plus tard. Pour un entier 32 bits signé, les valeurs vont de 1901-12-13 à 2038-01-19 03:14:07 UTC.

Ce n'est pas écrit dans la pierre. Eh bien, il est écrit, mais dans un tas de pierres différentes. Les plus anciens disent 32 bits, les plus récents 64 bits. Certaines spécifications indiquent que la signification est "définie par l'implémentation". Certains systèmes Unix utilisent un entier non signé pour s'étendre uniquement dans le futur après l'époque, mais la pratique habituelle a été un numéro signé. Certains utilisent un flottant plutôt qu'un entier. Pour plus de détails, voir l'article Wikipedia sur nix Time , et this Question .

Donc, fondamentalement, votre question n'a aucun sens. Vous devez connaître le contexte de votre langage de programmation (C standard, autre C, Java, etc.), l'environnement (compatible POSIX), une bibliothèque de logiciels particulière, un magasin de bases de données ou une application.

Évitez le comptage de l'époque

Ajoutez à ce manque de spécificité le fait que quelques dizaines d'autres époques ont été utilisés par divers systèmes logiciels, certains extrêmement populaires et courants. Les exemples incluent le 1er janvier 1601 pour le système de fichiers NTFS et COBOL, le 1er janvier 1980 pour divers systèmes de fichiers FAT, le 1er janvier 2001 pour Apple Cocoa et le 0 janvier 1900 pour Excel et Lotus 1 -2-3 feuilles de calcul.

Ajoutez en outre le fait que différentes granularités de comptage ont été utilisées. Outre des secondes entières, certains systèmes utilisent des millisecondes, des microsecondes ou des nanosecondes.

Je déconseille le suivi de la date et de l'heure en tant que décompte à partir de l'époque. Utilisez plutôt des types de données spécifiques lorsqu'ils sont disponibles dans votre langage de programmation ou votre base de données.

ISO 8601

Lorsque les types de données ne sont pas disponibles ou lors de l'échange de données, suivez la norme ISO 8601 qui définit les formats de chaîne sensibles pour différents types de valeurs date-heure.

  • Date
    • 2015-07-29
  • Une date-heure avec un décalage par rapport à UTC (Z est "Zulu" pour UTC) (notez le zéro de remplissage sur le décalage)
    • 2015-07-29T14:59:08Z
    • 2001-02-13T12:34:56.123+05:30
  • Semaine (avec ou sans jour de la semaine)
    • 2015-W31
    • 2015-W31-3
  • Date ordinale (jour de l'année)
    • 2015-210
  • Intervalle
    • "2007-03-01T13:00:00Z/2008-05-11T15:30:00Z"
  • Durée (format de PnYnMnDTnHnMnS)
    • P3Y6M4DT12H30M5S = "trois ans, six mois, quatre jours, douze heures, trente minutes et cinq secondes"

Recherchez sur StackOverflow.com de nombreuses autres questions et réponses sur ces sujets.

30
Basil Bourque