ISO 8601

Un article de Wikipédia, l'encyclopédie libre.

La norme internationale ISO 8601 spécifie la représentation numérique de la date et de l'heure. Cette notation est particulièrement destinée à éviter tout risque de confusion dans les communications internationales dû au grand nombre de notations nationales différentes. De plus, cette notation a de nombreux avantages pour une utilisation informatique par rapport aux autres notations. Elle est reprise par la norme française sous la référence NF EN 28601.

Il y a 6 niveaux de granularité dans ce format, selon les applications. Pour cette raison, il est possible d'omettre certains éléments.

Exemples:

La date ISO courante:
2008-06-17T11:20:33Z
ou encore:
2008-W25-2T11:20:33Z

Sommaire

[modifier] Principe

[modifier] Date et heure

On commence par les éléments les moins précis pour aller vers les plus détaillés. Donc l'année vient en tête (4 chiffres), suivie du mois (2 chiffres, de '01' à '12') et enfin du quantième (de '01' à '31'). Chaque élément est séparé de celui qui le précède par un tiret '-'. La date se base sur le calendrier grégorien. Ainsi, s'il était nécessaire de représenter des années avant la mise en application de ce calendrier (avant 1582-10-15 en France), il faudrait convenir par avance d'une méthode de comptage entre les parties s'échangeant les informations.

Puis on indique l'heure de la journée qui débute par la lettre T (pour Time, soit heure en anglais). Suivie des éléments utiles, dans cet ordre: heures (de '00' à '24'), minutes (de '00' à '59') puis secondes ('00' à '60') en utilisant deux-points ':' pour séparateur.

Et éventuellement suivi encore d'une virgule ',' puis de décimales de seconde. L'on rencontre parfois un point (toléré) au lieu d'une virgule, en particulier chez les anglophones. C'est toutefois la virgule qui est préférée par la norme.

Remarques importantes:

  • Si on doit ajouter des décimales, on en met autant que nécessaire à la précision recherchée. Exemple: T15:23:56,9854
  • Si la notation de l'heure utilise le numéro '24' alors les minutes et les secondes doivent être à '00'. C'est une manière pratique en informatique de distinguer début et fin de journée quand la date n'est pas précisée. T24:00 équivaut strictement à T00:00 du jour suivant.
  • L'écriture '60' pour les secondes représentera par contre bel et bien une 61e seconde. En effet, il est parfois nécessaire d'ajouter ou enlever une seconde intercalaire avant certains mois. (lire l'article sur le temps universel UTC pour les détails). T23:59:60 représenterait donc, le cas échéant, une seconde ajoutée entre T23:59:59 et T24:00:00.

Il est bien entendu que pour l'indication des heures habituelles ces possibilités sont inutiles. Par exemple, les horloges synchronisées n'indiquent généralement pas cette seconde intercalaire et préfèrent se resynchroniser progressivement. Utilisée ou non, toujours est-il que la norme a bel et bien prévu l'indication de ces secondes intercalaires.

[modifier] Fuseau horaire

Pour tous les formats acceptés dans la norme ISO 8601, il est possible de spécifier le fuseau horaire. Le signe de départ est positif (+) lorsque l’heure locale est en avance sur le temps universel (UTC) (fuseaux horaire à l’Est du méridien horaire de Greenwich : fuseaux horaires d’Europe centrale, Afrique centrale et de l’Est, Asie, Pacifique Ouest et central). Négatif (−) sinon (fuseaux horaires de quelques pays d’Europe occidentale ou d’Afrique occidentale, Amériques, Pacifique Est). Il y trois manières d’indiquer ce fuseau horaire :

  1. en ajoutant +hhmi ou hhmi dans les formats de base, hh représentant le nombre d’heures et mi le nombre de minutes de décalage par rapport au temps universel (le signe moins est habituellement le caractère ASCII tiret-moins, mais certaines représentations permettent le signe moins mathématique, dont la largeur est identique à celle du signe plus) ;
  2. en ajoutant +hh:mm ou -hh:mi dans les formats étendus, le séparateur horaire : étant écrit littéralement ;
  3. en inscrivant littéralement un Z final lorsqu’il s’agit de l’heure UTC. (Z pour méridien Zéro, ou (en) Zero meridian. Aussi connu sous le nom Zulu –prononcer zoulou– dans l’alphabet radio international).

Pour éviter d’éventuelles confusions, il s'agit bien d’un décalage exprimé depuis l’heure UTC (et non pas vers). Ce qui est logique puisqu’il s’agit d’une indication de fuseau horaire. Ainsi T09:00:00+01:00 correspond à T08:00:00Z (9 heures dans le fuseau ayant une heure de plus que l’UTC donc 8 heures en UTC).

[modifier] Formats habituels

Ci-dessous, les notations suivantes sont utilisées pour symboliser les formats présentés :

  • aaaa représente l’année grégorienne sur 4 chiffres fixes (1583 à 9999, les années 0001 à 1582 nécessitent un accord mutuel, de même que l'extension aux années à plus de 4 chiffres, il n'y pas de représentation standard des années avant Jésus-Christ, mais certains le permettent avec un accord mutuel en utilisant le préfixe littéral B suivi de 4 chiffres à partir de 0001 pour la désignation classique des années sans 0000, ou le préfixe U suivi d'un signe et de 4 chiffres à partir de 0000 pour l’extension grégorienne proleptique du calendrier UTC ; pour les années au delà de 9999 = U+9999 ou avant B9999 ou avant U-9999, un accord mutuel est aussi nécessaire pour utiliser 5 chiffres fixes ou plus car cela entraine un conflit avec les formats standards de base des dates incomplètes).
  • est écrit littéralement (signe moins, ASCII ou mathématique) dans les formats étendus (séparateur de date standard ISO), absent des formats de base.

En cas de notation de fractions (sur les heures, les minutes ou les secondes), le séparateur décimal est une virgule ou un point, la virgule étant le signe préféré.

  • mm représente le numéro de mois dans l'année sur deux chiffres (01 à 12).
  • qq représente le quantième dans le mois sur deux chiffres (01 à 31).
  • qqq représente le quantième dans l'année sur 3 chiffres (001 à 366).
  • AAAA représente l’année ISO sur 4 chiffres.
  • W est toujours écrit littéralement.
  • ww représente la semaine ISO sur deux chiffres (01 à 53).
  • j représente le jour ISO de la semaine sur un chiffre (1 à 7).
  • T est toujours écrit littéralement.
  • hh représente l’heure du jour sur deux chiffres (00 à 23).
  • : est écrit littéralement dans les formats étendus (séparateur horaire standard ISO).
  • mi représente la minute sur deux chiffres (00 à 59).
  • ss représente la seconde sur deux chiffres (00 à 60, en tenant compte des secondes ajoutées à la dernière minute de certains jours, selon la norme UTC)
  • . est écrit littéralement dans les formats étendus (séparateur décimal ISO ; un accord mutuel permettra d’utiliser plutôt la virgule).
  • n représente la fraction de seconde sur un ou plusieurs chiffres.
  • zzzzz représente le fuseau horaire dans le format de base (Z ou +hhmi ou hhmi).
  • zzzzzz représente le fuseau horaire dans le format étendu (Z ou +hh:mi ou hh:mi).

Les formats suivants peuvent alors être utilisés pour indiquer :

  • l’année seule :
format de base : "aaaa" (ex : 1997)
pas de format étendu
  • l’année et le mois :
format de base : "aaaamm" (ex : 199707)
format étendu : "aaaamm" (ex : 1997−07)
  • la date complète calendaire (année, mois, quantième) :
format de base : "aaaammqq" (ex : 19970716)
format étendu : "aaaammqq" (ex : 1997−07−16)
  • la date complète ordinale (année, jour de l’année) :
format de base : "aaaaqqq" (ex : 1997206)
format étendu : "aaaaqqq" (ex : 1997−206)
  • la date complète hebdomadaire (année ISO, semaine ISO, jour de la semaine ISO) selon le numéro de semaine :
format de base : "AAAAWwwj" (ex : 2004W453)
format étendu : "AAAA−Wwwj" (ex : 2004−W45−3)
  • la date complète calendaire avec heures et minutes :
format de base : "aaaammqqThhmizzzzz" (ex : 19970716T1920+0100)
format étendu : "aaaammqqThh:mizzzzzz" (ex : 1997−07−16T19:20+01:00)
  • la date complète calendaire plus l’heure, les minutes et les secondes :
format de base : "aaaammqqThhmisszzzzz" (ex : 19970716T192030+0100)
format étendu : "aaaammqqThh:mi:sszzzzzz" (ex : 1997−07−16T19:20:30+01:00)
  • la date complète calendaire et l’heure avec des fractions de seconde :
format de base : "aaaammqqThhmissnzzzzz" (ex : 19970716T1920304+0100)
format étendu : "aaaammqqThh:mi:ss,nzzzzzz" (ex : 1997−07−16T19:20:30,4+01:00)
  • l’heure seulement :
format de base : "Thhzzzzz" (ex : T19+0100)
format étendu : "Thhzzzzzz" (ex : T19+01:00)
  • l’heure et les minutes :
format de base : "Thhmizzzzz" (ex : T1920+0100)
format étendu : "Thh:mizzzzzz" (ex : T19:20+01:00)
  • l’heure, les minutes et les secondes :
format de base : "Thhmisszzzzz" (ex : T192030+0100)
format étendu : "Thh:mi:sszzzzzz" (ex : T19:20:30+01:00)
  • l’heure complète avec des fractions de seconde :
format de base : "Thhmissnzzzzz" (ex : T1920304+0100)
format étendu : "Thh:mi:ss,nzzzzzz" (ex : T19:20:30,4+01:00)

[modifier] Jour de l'année

Il est possible de représenter les dates en donnant l'année et le numéro du jour dans l'année. Donc un nombre sur 3 chiffres de '001' à '365' (voire '366' quand nécessaire). Exemple: 1970-033 représente le 33e jour de l'année 1970. Autrement dit le 2 février 1970. Cette notation est distinctive grâce aux 3 chiffres après l'année. (Le mois seul ne prendrait que deux chiffres. Le mois et un quantième nécessiteraient quatre chiffres en notation abrégée.)

[modifier] Numéro de semaine

[modifier] Système de numérotation

L'industrie a pris l'habitude de numéroter les semaines de l'année (semaine 1, 2,... 52 voire 53) pour s'organiser et planifier sa production. En pratique, tout le monde ne respecte pas nécessairement la même convention de numérotation (par exemple, le Canada et les États-Unis considèrent le dimanche plutôt que le lundi comme le premier jour de la semaine). Cette norme ISO a défini de façon stricte une règle de numérotation, reconnue internationalement et couramment utilisée:

  1. La semaine commence le lundi.
  2. Les jours de chaque semaine sont numérotés de 1 (un) pour le lundi, à 7 (sept) pour le dimanche;
  3. La semaine 1 est celle qui contient le premier jeudi de l'année.

Remarques et conséquences:

  • La semaine 1 est la première à contenir la majorité de ses jours (au moins 4 jours) dans l'année. Elle contient systématiquement le 4 janvier. C'est aussi celle dont le lundi est le plus proche du jour de l'an. Elle commence au plus tôt le 29 décembre ou au plus tard le 4 janvier.
  • La dernière semaine de l'année (52 ou 53) est celle qui contient le dernier jeudi de l'année. Elle est la dernière à avoir la majorité de ses jours (au moins 4) dans l'année et contient systématiquement le 28 décembre. C'est aussi celle dont le dimanche est le plus proche du 31 décembre. Elle termine au plus tôt le 28 décembre ou au plus tard le 3 janvier.
  • Il n'y a pas de semaine zéro (la semaine 1 d'une année succède immédiatement à la dernière semaine de l'année précédente).
  • Les premiers jours de la semaine 1 peuvent éventuellement être situés fin décembre de l'année précédente. De même, la dernière semaine (52 ou 53) d'une année peut avoir ses derniers jours au tout début de l'année suivante. Une année comporte toujours soit 52, soit 53 semaines au total.
  • Les années ont 52 semaines en général ( 365 jours = 52×7 + 1 ). Donc, si une année a son 1er janvier un lundi, son 31 décembre tombe aussi un lundi (un mardi si bissextile). Seules les années dont le jour de l'an est un jeudi auront 53 semaines (un mercredi ou un jeudi pour les années bissextiles).

[modifier] Notation normalisée

La norme prévoit également d'écrire une date d'après sa semaine. Il faut commencer par la lettre W (pour week, semaine en anglais) suivi du numéro de semaine sur deux chiffres (et éventuellement du numéro du jour de 1 à 7). Par exemple 2005-W52-1 correspond au premier jour (lundi) de la semaine 52 de l'année 2005. Soit autrement dit le lundi 26 décembre 2005 (ou 2005-12-26; les deux écritures sont équivalentes).

De la même façon, 2005-W52-7 correspond au dimanche de la dernière semaine de 2005: donc au 1er janvier 2006 !
(2006-W01-1 correspond au lundi 2 janvier 2006, soit 2006-01-02)

2004W48 désigne la semaine n°48 de l'année 2004.

[modifier] Algorithme informatique

Le calcul automatisé du numéro de semaine en informatique reste simple mais néanmoins non trivial, à cause des semaines charnières entre chaque année. Cette réflexion mérite donc d'être partagée.

Il sera précieux de noter que dans de nombreux langages de programmation informatiques, les outils comptent les jours de la semaine en partant du dimanche (valeur zéro), puis 1 pour le lundi, jusqu'à 6 pour le samedi. Ce n'était pas complètement idiot puisque dans certains pays la semaine commence le dimanche et que mathématiquement (modulo 7) 0 et 7 reviennent au même dans les tests. Mais, pour l'affichage, cela devient un cas particulier à traiter. Il existe parfois une fonction donnant directement une numérotation normalisée.

Pour écrire une fonction calculant le numéro ISO de la semaine à partir d'une date donnée, un bon algorithme, efficace et rapide, peut par exemple être le suivant:

  • Calculer le jeudi de la même semaine que la date cherchée. On calculera le numéro de semaine de ce jeudi pour être sûr de compter dans la bonne année sans test particulier. (Ce jeudi peut tomber l'année précédente ou suivante, c'est tout l'intérêt.)
  • On considère le 4 janvier de la même année que ce jeudi
  • On calcule le lundi de la même semaine que ce 4 janvier (identifiant ainsi le début du comptage; noter que ce lundi peut lui même tomber l'année encore avant: peu importe)
  • On calcule le nombre de jours écoulés entre nos deux dates particulières (ce jeudi et ce lundi).
  • On divise par 7 (arrondir à l'entier supérieur). On a le résultat voulu.

Certains algorithmes utilisent des exceptions plus ou moins justifiables, voire retournent des valeurs erronées pour certaines dates. L'avantage de celui-ci est d'être fiable tout en profitant des fonctions généralement disponibles (le compte des années bissextiles ou du nombre de jours est déjà implanté).

Si on sait J le jour correspondant à une date (de J=1 pour lundi, à J=7 pour dimanche), en adaptant les fonctions existantes si nécessaire. Alors le jeudi de la même semaine est situé (J-4) jours plus tôt (ou plus tard si négatif). Le lundi associé est (J-1) jours plus tôt.

[modifier] La notation abrégée

Il est possible de n'indiquer que les éléments utiles. On peut par exemple indiquer le mois de février 2003 par: 2003-02, sans devoir indiquer un jour précis ou un horaire. De manière générale on peut retirer toute information inutile (par exemple la date si seule l'heure est manipulée). Ce qui donne par exemple: T23:45.

Dans un contexte donné, les notations doivent toutes être abrégées de la même manière. Donc toutes sur un même nombre de caractères. Toutes avec les mêmes informations. Sinon, on perd l'avantage de cette normalisation pour la cohérence et la facilité du tri.

Autre exemple, si le fuseau horaire est indiqué, il n'est pas toujours nécessaire d'indiquer les minutes (souvent inutiles). Ainsi T23:05+05:00 pourra s'abréger T23:05+05 voire T2305+05 d'après ce qui suit.

Enfin, si une taille compacte est requise au détriment de la lisibilité, il est possible de retirer certains séparateurs (tiret ou deux-points). Il convient alors de les retirer tous (tous les tirets et/ou tous les deux-points) pour éviter les confusions. Une écriture prise hors de son contexte doit rester compréhensible et on doit en particulier identifier s'il s'agit d'une heure ou d'une date. (2005 est une année, T2005 ou 20:05 sont des heures)

Pour exemple, ces notations sont équivalentes:

20040204 = 2004-02-04 = 2004-W06-3 = 2004W063

Un dernier raccourci consiste à remplacer les éléments tronqués par un tiret '-'. Il est rarement employé. Toutefois il peut devenir nécessaire pour éviter des confusions. En omettant l'année, on noterait le 2 décembre ainsi :
"--1202". On pourrait le réduire à "-1202" sans confusion avec "1202" seul qui représenterait l'année 1202.

2003---12 ou 2003--12 représenteraient le 12 de n'importe quel mois de l'an 2003, sans confusion avec 2003-12 qui représenterait décembre 2003.

[modifier] Les durées et intervalles

Il est également possible d'indiquer une durée (mesure d'un temps écoulé) ou un intervalle de temps (entre deux dates précises). Pour ce faire on utilisera la barre oblique ' / ' pour séparateur.

[modifier] Intervalle entre deux dates

La barre oblique sépare la date de début et la date de fin. Si seul le dernier élément change il est possible de ne pas ré-écrire le début. Quelques exemples :

  • 2004-12-02T23:00/2005-01-01T12:30 : une période entre deux dates et horaires différents.
  • 2004-12-02T22:00/23:30 : période comprise entre 22h et 23h30 le 2 décembre 2004.
    2004-12-02T22:00/2004-12-02T23:30 : notation équivalente non abrégée
  • 2004-12-02T22:00/15 : période comprise entre 22h et 22h15 le 2 décembre 2004.
    2004-12-02T22:00/2004-12-02T22:15 : notation équivalente non abrégée
  • 2004-12-02T22/23 : période comprise entre 22h et 23h le 2 décembre 2004.
    2004-12-02T22/2004-12-02T23 : notation équivalente non abrégée
  • 2004-12-02/05: la période de temps entre les 2 et 5 décembre 2004 (comprendre que les deux dates sont données comme des bornes à zéro heure, donc la journée du 5 décembre est exclue).
    2004-12-02/2004-12-05 : notation équivalente non abrégée
  • T22:00/15 : intervalle entre 22h et 22h15 (la date est supposée connue dans le contexte).
    T22:00/T22:15 : notation équivalente non abrégée
  • T22/23 : intervalle entre 22h et 23h (la date est supposée connue dans le contexte).
    T22/T23 : notation équivalente non abrégée

[modifier] Durée

Une durée représente une quantité de temps dans l'absolu, sans commencer à un instant précis. Il faut commencer l'écriture par la lettre 'P' (pour Period en anglais). Exemple:

P18Y9M4DT11H9M8S qui représente une (longue) durée de 18 ans, 9 mois, 4 jours, 11 heures, 9 minutes et 8 secondes. On remarque sur cet exemple l'emploi d'initiales anglaises pour séparer les éléments ( Years, Months, Days, Hours, Minutes et Seconds). On remarque toujours la présence du T séparant les jours des heures. Il est vrai qu'ici la présence des H, M et S rend le T redondant. On pourrait aussi compter en semaines en réutilisant la lettre 'W': P3W représente par exemple une durée de 3 semaines.

Si le contexte nécessitait de distinguer des durées positives ou négatives, il suffit d'ajouter le signe '+' ou '-' en tête d'écriture.

[modifier] Une borne et la durée

On peut enfin combiner les deux notations et indiquer une période en fonction de sa date de début et sa durée. Exemple : 2004-12-02/P3D étant l'intervalle de temps d'une durée de 3 jours débutant le 2 décembre 2004.

Ou encore, à l'inverse, on peut indiquer d'abord la durée puis la date finale ('PT1H/2006-01-01' représente l'heure qui précède le passage au jour de l'an de 2006).

[modifier] Récurrence d'une durée

Si la durée est répétitive, on précède la notation par la lettre R. Exemple: R/PT01 signifie «toutes les heures».

La barre oblique '/' permet un ajout après le R pour indiquer (éventuellement) un nombre de répétitions. R5/PT01:30 signifie donc «cinq occurrences, espacées de une heure trente entre elles».

La durée entre chaque occurrence peut être indiquée par toutes les méthodes citées précédemment. (En indiquant deux dates ou en utilisant le symbole P pour des intervalles ou durées; avec ou sans indication d'une date de départ ou de fin.)

R12/1985-04-12T23:20:50/P1Y2M signifierait «12 occurrences séparées entre elles de un an et deux mois, en commençant la première le 12 avril 1985 à 23h20 et cinquante secondes»

[modifier] Avantages

Les avantages de cette normalisation sont les suivants :

  • Facile à lire et à écrire par un logiciel (pas de nom à traduire);
  • Facile à comparer et à trier (en gardant un format fixe dans un contexte donné);
  • Indépendant de la langue;
  • Pas (ou peu) de risque de confusion avec d'autres notations;
  • La notation est petite et de taille constante;
  • Compréhension intuitive des éléments de date et d'heure de la notation.

[modifier] Liens externes