Les timestamps Unix expliqués : secondes ou millisecondes, fuseaux horaires et problème de l'an 2038
Quand tombe 1700000000 ? Pourquoi certains systèmes utilisent-ils des nombres à 13 chiffres ? Pourquoi l'heure est-elle décalée d'exactement une heure ? La plupart des bugs liés au temps disparaissent une fois quelques notions comprises.
Qu'est-ce qu'un timestamp Unix ?
Un timestamp Unix (temps Unix, temps epoch) est un entier unique qui compte les secondes écoulées depuis le 1er janvier 1970 à 00:00:00 UTC, l'epoch Unix. 0 correspond à 1970-01-01 00:00:00 UTC et 1700000000 à 2023-11-14 22:13:20 UTC.
Représenter un instant par un seul nombre présente de nombreux avantages. L'écart entre deux instants se calcule par une simple soustraction, le tri et la comparaison sont triviaux, et un même instant a la même valeur partout, quels que soient le fuseau horaire ou le format de date.
0 → 1970-01-01 00:00:00 UTC
1700000000 → 2023-11-14 22:13:20 UTC
1735689600 → 2025-01-01 00:00:00 UTC
2147483647 → 2038-01-19 03:14:07 UTC
10 ou 13 chiffres : secondes ou millisecondes ?
Un timestamp actuel en secondes compte 10 chiffres. Mais Date.now() en JavaScript et System.currentTimeMillis() en Java renvoient des millisecondes, soit 13 chiffres. Les confondre donne des dates comme le 21 janvier 1970 ou des dates cinquante mille ans dans le futur.
Comptez les chiffres : 10 pour les secondes, 13 pour les millisecondes, 16 pour les microsecondes. Si une API ne précise pas l'unité, vérifiez-la, et multipliez ou divisez par 1 000 lors de la conversion.
Un timestamp n'a pas de fuseau horaire
Le point le plus important : un timestamp n'a pas de fuseau horaire. 1700000000 est le même instant à Paris et à New York. Le fuseau ne s'applique qu'au moment d'afficher le nombre sous forme de date lisible : la même valeur correspond à 22:13 en UTC et à 23:13 à Paris en hiver (UTC+1).
Le bug classique du « décalage d'une heure » vient du non-respect de cette règle : stocker en UTC mais afficher comme si c'était l'heure locale, ou stocker une heure locale sans décalage et la lire comme de l'UTC. Stockez et transmettez en UTC (ou en timestamps) ; affichez dans le fuseau de l'utilisateur.
Les pièges de l'heure d'été
La France, comme la majeure partie de l'Europe et les États-Unis, avance l'heure au printemps et la recule à l'automne, mais pas aux mêmes dates. « New York a six heures de retard sur Paris » n'est donc vrai qu'une partie de l'année : pendant quelques semaines en mars et en octobre-novembre, l'écart n'est que de cinq heures.
Utilisez des noms de fuseaux IANA comme America/New_York ou Europe/Paris plutôt que des décalages fixes comme -05:00, afin que les changements d'heure soient gérés automatiquement. Pour planifier une réunion avec une équipe à l'étranger ou configurer des tâches, vérifiez le décalage réel à cette date avec un calculateur de fuseaux horaires.
Le problème de l'an 2038
Stocké dans un entier signé de 32 bits, un timestamp plafonne à 2 147 483 647, soit le 19 janvier 2038 à 03:14:07 UTC. Une seconde plus tard, la valeur déborde en nombre négatif et revient en 1901. C'est le problème de l'an 2038.
Les systèmes d'exploitation et langages modernes utilisent surtout un temps sur 64 bits, mais des valeurs sur 32 bits subsistent dans de vieux équipements embarqués, des colonnes INT de bases de données et des formats de fichiers. Les systèmes qui manipulent des dates lointaines — certificats longue durée ou prêts sur 30 ans — peuvent déjà atteindre la limite : dans les nouvelles conceptions, utilisez des entiers 64 bits ou de vrais types date.
Secondes intercalaires et précision
Le temps Unix considère que chaque jour dure exactement 86 400 secondes et ignore les secondes intercalaires. Il peut donc différer très légèrement du temps écoulé astronomiquement exact, ce que les applications courantes peuvent ignorer sans risque. La Conférence générale des poids et mesures a décidé de supprimer les secondes intercalaires d'ici 2035.
Collez un nombre dans le convertisseur de timestamps d'AIBIZAP : il détecte automatiquement s'il s'agit de secondes ou de millisecondes et affiche la date en UTC et dans le fuseau choisi. Utilisez le calculateur de fuseaux horaires pour comparer les heures locales et le générateur cron pour les tâches qui se répètent à heure fixe.