Secondes ou millisecondes
Un timestamp Unix compte le temps écoulé depuis minuit UTC le 1er janvier 1970. L’ennui, c’est que certains systèmes comptent en secondes et d’autres en millisecondes.
- Secondes — commandes Unix, fonctions temporelles de PostgreSQL et MySQL, les champs
expetiatd’un JWT, la plupart des API REST - Millisecondes —
Date.now()en JavaScript,System.currentTimeMillis()en Java, beaucoup de chaînes de collecte de journaux
Confondre les deux vous envoie en janvier 1970 (millisecondes lues comme des secondes) ou vers l’an 50000 (secondes lues comme des millisecondes). Cet outil devine l’unité d’après l’ordre de grandeur et indique comment il a lu le nombre : dès qu’une date paraît étrange, commencez par cette ligne.
Le piège du fuseau
Un timestamp n’a pas de fuseau horaire. C’est un nombre unique désignant un instant ; le fuseau n’apparaît qu’au moment de transformer ce nombre en texte pour un humain. La même valeur se lit 16h à Paris et 10h à Montréal.
Un rapport de bogue qui dit «ça a échoué à 15h» arrive donc amputé de la moitié de l’information. Consignez des timestamps ou des chaînes ISO 8601 avec décalage, et ne fabriquez l’heure lisible qu’au moment de l’affichage.
Le problème de 2038
Stocké dans un entier signé de 32 bits, un timestamp déborde le 19 janvier 2038. À cet instant la valeur bascule en négatif et la date affiche 1901. Les langages et bases actuels utilisent 64 bits, mais si vous maintenez du firmware embarqué ancien ou du C hérité, la largeur de ce champ mérite un coup d’œil.
Valeurs négatives et zéro
Les valeurs négatives désignent des dates antérieures à 1970. Elles apparaissent dès qu’on stocke ainsi des dates anciennes comme une date de naissance, et certaines bibliothèques les gèrent mal.
Zéro correspond à minuit UTC le 1er janvier 1970. Quand cette valeur surgit dans de vraies données, ce n’est presque jamais une heure réelle : c’est un champ que personne n’a initialisé.