Aller au contenu principal

Appendix A. ISO 8601 Collected ABNF

Cette information est basée sur la version 1988 d'ISO 8601. Il peut y avoir quelques changements dans la révision de 2000.

Explication

ISO 8601 ne spécifie pas de grammaire formelle pour les formats de date et d'heure qu'il définit. Ce qui suit est une tentative de créer une grammaire formelle à partir d'ISO 8601. Ceci est fourni à titre informatif uniquement et peut contenir des erreurs. ISO 8601 reste la référence faisant autorité.

Ambiguïtés et interprétations

Notez qu'en raison d'ambiguïtés dans ISO 8601, une certaine interprétation a été nécessaire :

  1. Mélange de formats de base et étendus : ISO 8601 n'est pas clair si le mélange de format de base et étendu est autorisé. Cette grammaire permet le mélange.

  2. 24 heures : ISO 8601 n'est pas clair si l'heure 24 n'est autorisée que si les minutes et les secondes sont 0. Cette grammaire suppose que l'heure 24 est autorisée dans n'importe quel contexte.

  3. Restrictions de date : Les restrictions de la section 5.7 concernant date-mday s'appliquent.

  4. Délimiteur "T" : ISO 8601 spécifie que "T" peut être omis dans certaines circonstances. Cette grammaire requiert "T" pour éviter l'ambiguïté.

  5. Point décimal : ISO 8601 exige (dans la section 5.3.1.3) que si la fraction décimale est inférieure à 1, elle doit être précédée d'un "0". L'annexe B.2 d'ISO 8601 donne des exemples avec des fractions décimales non précédées de "0". Cette grammaire suppose que la section 5.3.1.3 est correcte et l'annexe B.2 est erronée.

Grammaire ABNF complète ISO 8601

date-century    = 2DIGIT  ; 00-99
date-decade = DIGIT ; 0-9
date-subdecade = DIGIT ; 0-9
date-year = date-decade date-subdecade
date-fullyear = date-century date-year
date-month = 2DIGIT ; 01-12
date-wday = DIGIT ; 1-7 ; 1 is Monday, 7 is Sunday
date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31
date-yday = 3DIGIT ; 001-365, 001-366
date-week = 2DIGIT ; 01-52, 01-53

datepart-fullyear = [date-century] date-year ["-"]
datepart-ptyear = "-" [date-subdecade ["-"]]
datepart-wkyear = datepart-fullyear / datepart-ptyear

dateopt-century = "-" / date-century
dateopt-fullyear = "-" / datepart-fullyear
dateopt-year = "-" / (date-year ["-"])
dateopt-month = "-" / (date-month ["-"])
dateopt-week = "-" / (date-week ["-"])

datespec-full = datepart-fullyear date-month ["-"] date-mday
datespec-year = date-century / dateopt-century date-year
datespec-month = "-" dateopt-year date-month [["-"] date-mday]
datespec-mday = "--" dateopt-month date-mday
datespec-week = datepart-wkyear "W"
(date-week / dateopt-week date-wday)
datespec-wday = "---" date-wday
datespec-yday = dateopt-fullyear date-yday

date = datespec-full
/ datespec-year
/ datespec-month
/ datespec-mday
/ datespec-week
/ datespec-wday
/ datespec-yday

time-hour = 2DIGIT ; 00-24
time-minute = 2DIGIT ; 00-59
time-second = 2DIGIT ; 00-58, 00-59, 00-60
time-fraction = ("," / ".") 1*DIGIT
time-numoffset = ("+" / "-") time-hour [[":"] time-minute]
time-zone = "Z" / time-numoffset

timeopt-hour = "-" / (time-hour [":"])
timeopt-minute = "-" / (time-minute [":"])

timespec-hour = time-hour [[":"] time-minute [[":"] time-second]]
timespec-minute = timeopt-hour time-minute [[":"] time-second]
timespec-second = "-" timeopt-minute time-second
timespec-base = timespec-hour / timespec-minute / timespec-second

time = timespec-base [time-fraction] [time-zone]

iso-date-time = date "T" time

RFC 3339 vs ISO 8601 complet

RFC 3339 est un sous-ensemble restreint d'ISO 8601, pas une implémentation complète :

FonctionnalitéISO 8601RFC 3339
Format de base (20020715)✅ Pris en charge❌ Non pris en charge
Format étendu (2002-07-15)✅ Pris en charge✅ Pris en charge
Dates de semaine (2002-W29-1)✅ Pris en charge❌ Non pris en charge
Dates ordinales (2002-196)✅ Pris en charge❌ Non pris en charge
Dates partielles (2002-07)✅ Pris en charge❌ Non pris en charge
24 heures (2002-07-16T24:00:00)✅ Pris en charge❌ Non pris en charge
Fuseau horaire "Z"✅ Pris en charge✅ Pris en charge
Décalage de fuseau horaire numérique✅ Pris en charge✅ Pris en charge (obligatoire)
Secondes fractionnaires✅ Pris en charge✅ Pris en charge

Raisons de la simplification de RFC 3339

RFC 3339 a choisi un sous-ensemble simplifié pour :

  1. Interopérabilité : Réduire les variations d'implémentation
  2. Clarté : Éviter l'ambiguïté
  3. Complétude : Exiger des informations complètes de date-heure
  4. Simplicité : Plus facile à implémenter et à tester

Remarque : Si la fonctionnalité complète d'ISO 8601 (comme les dates de semaine) est nécessaire, consultez directement la norme ISO 8601. RFC 3339 se concentre sur les cas d'utilisation d'horodatage les plus courants dans les protocoles Internet.