ISO 8601

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

La norme internationale ISO 8601 spécifie la représentation numérique de la date et de l'heure — respectivement basées sur le calendrier grégorien et le système horaire de 24 heures. Cette notation, créée en 1988, est particulièrement destinée à éviter tout risque de confusion dans les communications internationales dû au grand nombre de notations nationales différentes. Elle a en outre 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 (cette norme a été annulée le 07 octobre 2011 [réf. souhaitée]).

Il y a six 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 :
2014-07-31
L'heure ISO courante :
01:36:19Z
La date et l'heure ISO courantes :
2014-07-31T01:36:19Z
ou encore :
2014-W31-4T01:36:19Z

Historique[modifier | modifier le code]

La première édition de la norme ISO 8601 a été publiée en 1988. Elle a remplacé et unifié plusieurs normes ISO traitant les différent aspects de notation des dates et des heures (normes ISO 2014, 2015, 2711, 3307 et 4031)[1]. Cette norme a été mise à jour en 2000 puis 2004.

La notation numérique du plus étendu au plus précis (aaa-mm-jj) a été introduite par la norme ISO 2014 ; La numérotation des semaines par l'ISO 2015.

C'est le comité technique TC 154 qui s'occupe de la maintenance la norme ISO 8601[2].

Principe[modifier | modifier le code]

Date et heure[modifier | modifier le code]

Les éléments les moins précis commencent pour aller vers les plus détaillés. 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 fonde 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), une méthode de comptage entre les parties s'échangeant les informations devrait être convenue par avance.

Puis est indiquée l'heure de la journée qui débute par la lettre T (pour Time, soit temps en anglais), suivie des éléments suivants, 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. 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 :

  • Des décimales peuvent être ajoutées en quantité 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.

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.

Fuseau horaire[modifier | modifier le code]

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 a 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:mi 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). 09:00+01:00 ne représente pas l'addition de 09:00 et de 01:00, ce qui aurait été encore plus logique, mais plutôt cette addition-ci: 09:00 = UTC +01:00.

Formats habituels[modifier | modifier le code]

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 entraîne 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 (peut être omis lorsqu'il n'y a pas de risque de confusion[3]).
  • 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 préféré[4] ; le point étant acceptable).
  • 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)

Jour de l'année[modifier | modifier le code]

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.)

Numéro de semaine[modifier | modifier le code]

Article détaillé : Numérotation ISO des semaines.

Système de numérotation[modifier | modifier le code]

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. Elle contient systématiquement le premier jour ouvré de l'année en considérant que le 1er janvier, les samedis et les dimanches sont chômés. 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).

Notation normalisée[modifier | modifier le code]

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.

Algorithme informatique[modifier | modifier le code]

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.

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. Dans certains pays, la semaine commence le dimanche et, mathématiquement (modulo 7), 0 et 7 reviennent au même dans les tests. Pour l'affichage, cela devient un cas particulier à traiter. Il existe parfois une fonction donnant directement une numérotation normalisée.

Pour calculer le numéro ISO de la semaine contenant une date 'D' donnée, il y a différents algorithmes. Cela peut être par exemple :

  • calculer le jeudi 'J' de la même semaine que la date 'D' cherchée. (Ce jeudi est nécessairement situé dans la bonne année de numérotation, cela évite de gérer des cas particuliers). Ce jeudi peut donc tomber l'année précédente ou suivante ; le numéro ISO de la semaine de 'D' est identique à celui de 'J'
  • calculer 'n' le numéro du jour de 'J' dans l'année ; le numéro de semaine est égal à 1 plus le résultat de la division euclidienne de ('n'-1) par 7 (le numéro ISO de la semaine de 'J', et donc de 'D', est le nombre de jeudis écoulés entre le début de l'année où se situe 'J' et 'J').

Certains algorithmes utilisent des exceptions peu justifiables, voire retournent des valeurs erronées pour certaines dates. L'avantage de l'algorithme précédent 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à implémenté).

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.

La notation abrégée[modifier | modifier le code]

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.

Les durées et intervalles[modifier | modifier le code]

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.

Intervalle entre deux dates[modifier | modifier le code]

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.

Durée[modifier | modifier le code]

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.

Une borne et la durée[modifier | modifier le code]

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).

Récurrence d'une durée[modifier | modifier le code]

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 »

Avantages[modifier | modifier le code]

Les avantages de cette normalisation sont les suivants :

  • Facile à lire et à écrire par un logiciel (pas de nom à traduire) ;
  • Facile à comparer et à classer (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.

Notes et références[modifier | modifier le code]

  1. « ISO 8601:1988, revisions » (consulté le 31 mai 2014)
  2. (en) « ISO/TC 154 Processes, data elements and documents in commerce, industry and administration » (consulté le 31 mai 2014)
  3. norme ISO 8601:2004(E), ISO — ISO 4.3.2 NOTE: By mutual agreement of the partners in information interchange, the character [T] may be omitted in applications where there is no risk of confusing a date and time of day representation with others defined in this International Standard.
  4. norme ISO 8601:2004(E), ISO — ISO 4.2.2.4 … the decimal fraction shall be divided from the integer part by the decimal sign specified in ISO 31-0, i.e. the comma [,] or full stop [.]. Of these, the comma is the preferred sign.

Liens externes[modifier | modifier le code]