Timestamp converter unix : comprendre et manipuler le temps en informatique
Qu'est-ce que l'epoch Unix et le timestamp ?
Le timestamp Unix (aussi appelé POSIX time ou epoch time) est le nombre de secondes écoulées depuis le 1er janvier 1970 à 00:00:00 UTC. Cette date de référence, appelée epoch Unix, a été choisie lors de la conception du système d'exploitation Unix dans les laboratoires Bell d'AT&T au début des années 1970.
L'avantage fondamental du timestamp Unix est sa neutralité temporelle : il représente un instant absolu, indépendant des fuseaux horaires, des changements d'heure saisonniers et des calendriers locaux. Deux serveurs situés dans des fuseaux horaires différents qui enregistrent le même événement obtiendront exactement le même timestamp. La conversion en heure locale n'intervient qu'au moment de l'affichage.
Timestamp Unix = nombre de secondes depuis le 1er janvier 1970 00:00:00 UTC
Le problème Y2K38 : la bombe à retardement des systèmes 32 bits
Les systèmes qui stockent le timestamp Unix en entier signé 32 bits peuvent représenter des valeurs comprises entre -2 147 483 648 et 2 147 483 647. La valeur maximale correspond au 19 janvier 2038 à 03:14:07 UTC. Une seconde après, le compteur revient à une valeur négative, interprétée comme une date en décembre 1901.
2 147 483 647
Valeur maximale d'un entier signé 32 bits, atteinte le 19 janvier 2038 à 03:14:07 UTC
Ce problème, connu sous le nom de bug Y2K38 (Year 2038 Problem), est l'équivalent du bug de l'an 2000 pour les systèmes Unix. Les systèmes modernes 64 bits ne sont pas affectés : un entier signé 64 bits peut stocker des dates jusqu'à l'an 292 milliards, bien au-delà de la durée de vie de l'univers.
Capacité de stockage temporel par type d'entier
Source : IEEE Std 1003.1 (POSIX)
Secondes vs millisecondes : attention aux pièges
Le timestamp Unix classique est exprimé en secondes. Cependant, de nombreux langages et APIs utilisent les millisecondes, ce qui multiplie la valeur par 1 000. Ne pas identifier correctement l'unité est l'une des erreurs les plus courantes en développement.
Secondes (Unix classique)
1 711 065 600
Python time.time(), PHP time(), SQL UNIX_TIMESTAMP()
Millisecondes (JavaScript)
1 711 065 600 000
JS Date.now(), Java System.currentTimeMillis()
Notre convertisseur détecte automatiquement l'unité : si la valeur dépasse 10¹², elle est interprétée comme des millisecondes. En cas de doute, un timestamp en secondes pour une date récente comporte 10 chiffres (ex : 1711065600), tandis qu'un timestamp en millisecondes en comporte 13 (ex : 1711065600000).
Exemple illustré : stocker et afficher des dates correctement
Prenons le cas d'une application web qui enregistre des événements utilisateur et les affiche en heure locale.
Le serveur enregistre le timestamp Unix (secondes)
1711065600 Le JSON contient le timestamp brut, sans fuseau
{ "created_at": 1711065600 } Le navigateur convertit selon le fuseau de l'utilisateur
22 mars 2024 à 01:00 (CET) Bonne pratique
Obtenir le timestamp dans différents langages
Chaque langage de programmation offre sa propre méthode pour obtenir le timestamp courant. Voici un récapitulatif des fonctions les plus utilisées :
- JavaScript :
Date.now()(millisecondes) ouMath.floor(Date.now()/1000)(secondes) - Python :
import time; time.time()(secondes, float) - PHP :
time()(secondes, entier) - Go :
time.Now().Unix()(secondes) - Bash :
date +%s(secondes) - SQL (PostgreSQL) :
EXTRACT(EPOCH FROM NOW())
Fuseaux horaires et gestion de l'heure d'été
Le timestamp Unix est par définition en UTC. La complexité survient lors de la conversion en heure locale, car les règles de fuseaux horaires et de changement d'heure sont gérées par la base de données IANA tz (souvent appelée "Olson database"), mise à jour plusieurs fois par an. Un même timestamp peut correspondre à des heures différentes selon le fuseau : 1711065600 correspond au 22 mars 2024 à 00:00 UTC, mais au 21 mars 2024 à 19:00 à New York (UTC-5). Pour encoder correctement vos paramètres d'URL contenant des timestamps, utilisez notre encodeur/décodeur URL.
Attention aux leap seconds
Erreurs fréquentes à éviter
- Confondre secondes et millisecondes. JavaScript utilise les millisecondes (
Date.now()= 13 chiffres), tandis que la plupart des APIs Unix utilisent les secondes (10 chiffres). Diviser ou multiplier par 1 000 au mauvais endroit décale la date de plusieurs décennies. - Stocker des dates en format texte avec fuseau local. "2024-03-22 01:00:00" est ambigu si le fuseau n'est pas précisé. Stockez en UTC ou en timestamp Unix, et convertissez à l'affichage.
- Ignorer le problème Y2K38 dans les systèmes embarqués. Les appareils IoT et systèmes embarqués 32 bits déployés aujourd'hui seront encore en service en 2038. Prévoyez un type 64 bits dès la conception.
- Utiliser des timestamps négatifs sans vérification. Un timestamp négatif correspond à une date avant le 1er janvier 1970. Certains langages et systèmes ne les supportent pas correctement.
- Comparer des timestamps de précisions différentes. Si un système utilise les secondes et un autre les millisecondes, la comparaison directe produira des résultats absurdes. Normalisez toujours la précision avant de comparer.
Sources et références
- IEEE Std 1003.1 (POSIX.1-2017) : définition du temps Unix et de l'epoch.
- MDN Web Docs, Date : documentation de l'objet Date JavaScript.
- IANA Time Zone Database : base de données officielle des fuseaux horaires.
- Year 2038 problem (Wikipedia) : explication détaillée du bug Y2K38.