Le problème que résout ISO 8601
Que signifie 03/04/05 ? Aux États-Unis, c’est le 4 mars 2005. Dans la plupart de l’Europe, c’est le 3 avril 2005. Au Japon, c’est le 5 avril 2003. Ce genre d’ambiguïté a causé des contrats échoués, des vols manqués, des factures payées en double et au moins un désastre célèbre de migration de base de données. ISO 8601, publié pour la première fois en 1988 et révisé récemment sous les noms ISO 8601-1:2019 et ISO 8601-2:2019, existe pour faire disparaître tout cela.
Le format de base
La règle principale est simple : écrire les dates au format AAAA-MM-JJ, toujours avec une année à quatre chiffres et toujours avec l’unité la plus grande en premier. Le format se trie correctement en tant que chaîne brute, ce qui en fait la valeur par défaut dans les bases de données, les fichiers journaux et les noms de fichiers.
Heures et dates-heures combinées
Les heures utilisent la notation 24 heures : HH:MM:SS. Une date et une heure combinées utilisent un "T" littéral comme séparateur : 2025-01-25T14:30:00. Le fuseau horaire est ajouté avec un "Z" pour UTC ou un décalage signé comme +02:00. Un instant pleinement qualifié ressemble à 2025-01-25T14:30:00+01:00.
Dates par semaine
ISO 8601 définit aussi un calendrier basé sur les semaines que beaucoup d’entreprises utilisent pour le reporting fiscal. Les semaines commencent le lundi. La semaine 1 est celle qui contient le premier jeudi de l’année. Une date par semaine s’écrit AAAA-Wss-J, par exemple 2025-W04-6. C’est pourquoi certaines années ont 52 semaines ISO et d’autres 53.
Dates ordinales
Un format moins courant mais utile est la date ordinale : AAAA-JJJ, où JJJ est le jour de l’année de 001 à 365 (ou 366 dans une année bissextile). La NASA, les météorologues et l’industrie aérienne les utilisent fréquemment.
Durées et intervalles
ISO 8601 définit aussi une syntaxe pour les durées. Une durée commence par la lettre "P" (pour "period") et utilise des désignateurs d’une seule lettre. Exemples :
P1Y— un anP3M— trois moisPT2H30M— deux heures trente minutesP1Y2M10DT2H30M— un an, deux mois, dix jours, deux heures et demie
Un intervalle est constitué de deux dates-heures séparées par une barre oblique : 2025-01-01T00:00:00Z/2025-12-31T23:59:59Z. Un intervalle répété est préfixé par R[n]/.
RFC 3339 : le profil internet
La plupart des protocoles internet n’utilisent pas directement ISO 8601. Ils utilisent RFC 3339, une spécification de 2002 par Graham Klyne et Chris Newman qui définit un sous-ensemble strict d’ISO 8601. RFC 3339 est utilisé par les APIs JSON, les fichiers journaux, les jetons OAuth et les en-têtes d’e-mail.
Conseils pratiques pour développeurs
- Stockez toujours les horodatages en UTC. Convertissez en heure locale uniquement à l’affichage.
- Écrivez toujours des années à quatre chiffres.
- Utilisez
AAAA-MM-JJdans les noms de fichiers ; ils se trient chronologiquement sans logique supplémentaire. - Si votre API renvoie une date, renvoyez-la en chaîne ISO 8601 en UTC, pas en timestamp Unix.
- Analysez avec une vraie bibliothèque. Les analyseurs regex faits maison finissent par échouer.
- Attention à l’année-semaine ISO.
2024-12-30est dans l’année-semaine ISO 2025.
Pour aller plus loin
- ISO, "ISO 8601-1:2019 Date and time — Representations for information interchange — Part 1: Basic rules" (2019).
- Klyne, G. et Newman, C., "Date and Time on the Internet: Timestamps", IETF RFC 3339 (juillet 2002).