Formats supportés de temps et de dates

Cette section décrit, dans un format de type BNF, tous les formats différents que l'analyseur de DateTimeImmutable, DateTime, date_create_immutable(), date_create(), date_parse(), et strtotime() est capable de comprendre. Les formats sont groupés par sections. Dans la plupart des cas, les formats de sections différentes, séparé par des caractères d'espacement blanc, des virgules ou des points, peuvent être utilisés dans la même chaîne date/moment. Pour chaque format supporté, un ou plusieurs exemples sont donnés ainsi qu'une description du format correspondant. Les caractères entre guillemets simples pour les formats sont insensibles à la casse ('t' pourrait s'écrire t ou T), les caractères écrits entre guillemets doubles, eux, sont sensibles à la casse ("T" et seulement T).

Pour formatter des objets DateTimeImmutable et DateTime, veuillez vous référer à la documentation de la méthode DateTimeInterface::format().

Un ensemble de règles générales devrait être pris en compte.

  1. L'analyseur, permet à chaque unité (année, mois, jour, heure, minute, seconde) la plage entière de valeurs. Pour une année c'est juste 4 chiffres, pour un mois c'est 0-12, pour un jour 0-31 et pour l'heure et les minutes c'est 0-59.
  2. 60 est autorisé pour les secondes, car parfois des chaînes de dates avec cette seconde intercalaire apparaisse. Mais PHP implémente le temps Unix où "60" n'est pas un nombre de secondes valides et ainsi overflow.
  3. strtotime() returns false si un des nombres et en-dehors de la plage, et DateTimeImmutable::__construct() lance une exception.
  4. Si une chaîne contient une date, tous les éléments sont remis à 0.
  5. Tous les éléments de temps moins significatifs sont remis à 0 si n'importe quel élément d'un temps est présent dans la chaîne donnée.
  6. L'analyseur est idiot, et n'effectue pas de vérification pour le rendre plus rapide (et plus générique).
  7. Outre les règles applicables aux éléments temporels individuels, l'analyseur comprend également des formats composés plus spécifiques, tels que l'analyse des horodatages Unix (@1690388256) et des dates hebdomadaires ISO (2008-W28-3).
  8. Il y a une vérification additionnelle si une date invalide est fourni :

    <?php
    $res
    = date_parse("2015-09-31");
    var_dump($res["warnings"]);
    ?>

    L'exemple ci-dessus va afficher :

    array(1) {
      [11] =>
      string(27) "The parsed date was invalid"
    }
    

  9. Il est déjà possible de gérer c'est cas spéciaux, mais l'utilisation de It is already possible to handle the edge cases, but then you need to use DateTimeImmutable::createFromFormat() est requis en fournissant le format voulu.

    <?php
    $res
    = DateTimeImmutable::createFromFormat("Y-m-d", "2015-09-34");
    var_dump($res);

    L'exemple ci-dessus va afficher :

    object(DateTimeImmutable)#1 (3) {
      ["date"] =>
      string(26) "2015-10-04 17:24:43.000000"
      ["timezone_type"] =>
      int(3)
      ["timezone"] =>
      string(13) "Europe/London"
    }
    

Formats pour les temps (Time)

Cette page décrit les différents formats dans une syntaxe de type BNF que les analyseurs de DateTimeImmutable, DateTime, date_create(), date_create_immutable(), et strtotime() comprennent.

Pour formatter des objets DateTimeImmutable et DateTime, veuillez vous référer à la documentation de la méthode DateTimeInterface::format().

Symboles utilisés
Description Formats Exemples
frac . [0-9]+ ".21342", ".85"
hh "0"?[1-9] | "1"[0-2] "04", "7", "12"
HH [01][0-9] | "2"[0-4] "04", "07", "19"
méridien [AaPp] .? [Mm] .? [\0\t ] "A.m.", "pM", "am."
MM [0-5][0-9] "00", "12", "59"
II [0-5][0-9] "00", "12", "59"
espace [ \t]  
tz "("? [A-Za-z]{1,6} ")"? | [A-Z][a-z]+([_/][A-Z][a-z]+)+ "CEST", "Europe/Amsterdam", "America/Indiana/Knox"
tzcorrection "GMT"? [+-] hh ":"? MM? "+0400", "GMT-07:00", "-07:00"
Notation 12 heures
Description Format Exemples
Heures seules, avec méridien hh espace? méridien "4 am", "5PM"
Heures et minutes, avec méridien hh [.:] MM space? méridien "4:08 am", "7:19P.M."
Heures, minutes et secondes avec méridien hh [.:] MM [.:] II espace? méridien "4:08:37 am", "7:19:19P.M."
MS SQL (Heures, minutes, secondes et fraction avec méridien) hh ":" MM ":" II [.:] [0-9]+ meridian "4:08:39:12313am"
Notation 24 heures
Description Format Exemples
Heures et minutes 't'? HH [.:] MM "04:08", "19.19", "T23:43"
Heures et minutes, sans double-points 't'? HH MM "0408", "t1919", "T2343"
Heures, minutes et secondes 't'? HH [.:] MM [.:] II "04.08.37", "t19:19:19"
Heures, minutes et secondes, sans double-points 't'? HH MM II "040837", "T191919"
Heures, minutes, secondes et fuseau horaire 't'? HH [.:] MM [.:] II space? ( tzcorrection | tz ) "040837CEST", "T191919-0700"
Heures, minutes, secondes et fraction 't'? HH [.:] MM [.:] II frac "04.08.37.81412", "19:19:19.532453"
Information de fuseau horaire tz | tzcorrection "CEST", "Europe/Amsterdam", "+0430", "GMT-06:00"

Formats de dates

Cette page décrit les différents formats dans une syntaxe de type BNF que les analyseurs de DateTimeImmutable, DateTime, date_create(), date_create_immutable(), et strtotime() comprennent.

Pour formatter des objets DateTimeImmutable et DateTime, veuillez vous référer à la documentation de la méthode DateTimeInterface::format().

Symboles utilisés
Description Format Exemples
suffixe des jours "st" | "nd" | "rd" | "th"  
dd ([0-2]?[0-9] | "3"[01]) daysuf? "7th", "22nd", "31"
DD "0" [0-9] | [1-2][0-9] | "3" [01] "07", "31"
m 'january' | 'february' | 'march' | 'april' | 'may' | 'june' | 'july' | 'august' | 'september' | 'october' | 'november' | 'december' | 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' | "I" | "II" | "III" | "IV" | "V" | "VI" | "VII" | "VIII" | "IX" | "X" | "XI" | "XII"  
M 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec'  
mm "0"? [0-9] | "1"[0-2] "0", "04", "7", "12"
MM "0" [0-9] | "1"[0-2] "00", "04", "07", "12"
y [0-9]{1,4} "00", "78", "08", "8", "2008"
yy [0-9]{2} "00", "08", "78"
YY [0-9]{4} "2000", "2008", "1978"
YYY [0-9]{5,19} "81412", "20192"
Standards Formats
Description Exemples
ATOM "2022-06-02T16:58:35+00:00"
COOKIE "Thursday, 02-Jun-2022 16:58:35 UTC"
ISO8601 "2022-06-02T16:58:35+0000"
» RFC 822 "Thu, 02 Jun 22 16:58:35 +0000"
» RFC 850 "Thursday, 02-Jun-22 16:58:35 UTC"
» RFC 1036 "Thu, 02 Jun 22 16:58:35 +0000"
» RFC 1123 "Thu, 02 Jun 2022 16:58:35 +0000"
» RFC 2822 "Thu, 02 Jun 2022 16:58:35 +0000"
» RFC 3339 "2022-06-02T16:58:35+00:00"
» RFC 3339 Extended "2022-06-02T16:58:35.698+00:00"
» RFC 7231 "Thu, 02 Jun 2022 16:58:35 GMT"
RSS "Thu, 02 Jun 2022 16:58:35 +0000"
W3C "2022-06-02T16:58:35+00:00"
Notations localisées
Description Format Exemples
Mois américain et jour mm "/" dd "5/12", "10/27"
Mois américain, jour et année mm "/" dd "/" y "12/22/78", "1/17/2006", "1/17/6"
Année sur quatre chiffres, mois et jour avec slashs YY "/" mm "/" dd "2008/6/30", "1978/12/22"
Année sur quatre chiffres et mois (GNU) YY "-" mm "2008-6", "2008-06", "1978-12"
Année, mois et jour avec tirets y "-" mm "-" dd "2008-6-30", "78-12-22", "8-6-21"
Jour, mois et année sur quatre chiffres, avec des points, des tabulations ou des tirets dd [.\t-] mm [.-] YY "30-6-2008", "22.12.1978"
Jour, mois et année sur deux chiffres, avec des points ou des tabulations dd [.\t] mm "." yy "30.6.08", "22\t12.78"
Jour, mois textuel et année dd ([ \t.-])* m ([ \t.-])* y "30-June 2008", "22DEC78", "14 III 1879"
Mois textuel et année sur quatre chiffres (le jour sera le 1) m ([ \t.-])* YY "June 2008", "DEC1978", "March 1879"
Année sur quatre chiffres et mois textuel (le jour sera le 1) YY ([ \t.-])* m "2008 June", "1978-XII", "1879.MArCH"
Mois textuel, jour et année m ([ .\t-])* dd [,.stndrh\t ]+ y "July 1st, 2008", "April 17, 1790", "May.9,78"
Mois textuel et jour m ([ .\t-])* dd [,.stndrh\t ]* "July 1st,", "Apr 17", "May.9"
Jour et mois textuel dd ([ .\t-])* m "1 July", "17 Apr", "9.May"
Mois abrégé, jour et année M "-" DD "-" y "May-09-78", "Apr-17-1790"
Année, mois abrégé et jour y "-" M "-" DD "78-Dec-22", "1814-MAY-17"
Année (et juste l'année) YY "1978", "2008"
Année (développé, 5-19 chiffres avec signe) [+-] YYY "-81120", "+20192"
Mois textuel (et juste le mois) m "March", "jun", "DEC"
Notations ISO8601
Description Format Exemples
Année, mois et jour sur huit chiffres YY MM DD "15810726", "19780417", "18140517"
Année sur quatre chiffres, mois et jour avec des slashes YY "/" MM "/" DD "2008/06/30", "1978/12/22"
Année sur deux chiffres, mois et jour avec des tirets yy "-" MM "-" DD "08-06-30", "78-12-22"
Année sur quatre chiffres avec un signe optionnel, mois et jour [+-]? YY "-" MM "-" DD "-0002-07-26", "+1978-04-17", "1814-05-17"
Année à cinq chiffres avec le signe, le mois et le jour requis [+-] YYY "-" MM "-" DD "-81120-02-26", "+20192-04-17"

Note:

Pour les formats y et yy, les années avant 100 sont considérées d'une manière spéciale lorsque les symboles y ou yy sont utilisés. Si l'année est comprise entre 0 (inclusif) et 69 (inclusif), 2000 sera ajouté. Si l'année est comprise entre 70 (inclusif) et 99 (inclusif) alors 1900 sera ajouté. Cela signifie que "00-01-01" est interprété comme "2000-01-01".

Note:

Le format "Jour, mois et année sur deux chiffres avec tabulations ou points" (dd [.\t] mm "." yy) ne fonctionne que pour des valeurs d'années de 61 (inclusif) à 99 (inclusif) - en dehors de ces bornes, le format du temps "HH [.:] MM [.:] SS" a une précédence plus forte et primera.

Note:

Le format "Année (et juste l'année)" ne fonctionne que si la chaine qui représente le temps a déjà été trouvée, sinon le format est reconnu comme HH MM.

Attention

Il est possible d'ajouter ou soustraire une retenue pour les formats dd et DD. Le jour 0 signifie le dernier jour du mois précédent, les retenues positives compteront le mois suivant. Ainsi, "2008-08-00" est équivalent à "2008-07-31" et "2008-06-31" est équivalent à "2008-07-01" (juin ne possède que 30 jours).

Il est à noter que la plage de jour est limitée à 0-31 comme indiqué par l'expression régulière ci-dessus. Ainsi, "2008-06-32" n'est pas une chaîne de date valide, par exemple.

Il est aussi possible de jouer avec les retenues des formats mm et MM grâce à la valeur 0. Une valeur de mois de 0 signifie Décembre de l'année précédente. Par exemple "2008-00-22" est équivalent à "2007-12-22".

Si vous combinez les deux notions précédentes et utilisez une retenue négative sur le jour et le mois, alors il se passe ceci : "2008-00-00" est converti d'abord vers "2007-12-00" puis vers "2007-11-30". Ceci arrive aussi avec la chaine "0000-00-00" qui est alors transformée vers "-0001-11-30" (l'année -1 dans le calendrier ISO 8601, qui est 2 BC dans le calendrier Grégorien).

Formats composés

Cette page décrit les différents formats dans une syntaxe de type BNF que les analyseurs de DateTimeImmutable, DateTime, date_create(), date_create_immutable(), et strtotime() comprennent.

Pour formatter des objets DateTimeImmutable et DateTime, veuillez vous référer à la documentation de la méthode DateTimeInterface::format().

Symboles utilisés
Description Formats Exemples
DD "0" [0-9] | [1-2][0-9] | "3" [01] "02", "12", "31"
doy "00"[1-9] | "0"[1-9][0-9] | [1-2][0-9][0-9] | "3"[0-5][0-9] | "36"[0-6] "001", "012", "180", "350", "366"
frac . [0-9]+ ".21342", ".85"
hh "0"?[1-9] | "1"[0-2] "04", "7", "12"
HH [01][0-9] | "2"[0-4] "04", "07", "19"
méridien [AaPp] .? [Mm] .? [\0\t ] "A.m.", "pM", "am."
ii [0-5]?[0-9] "04", "8", "59"
II [0-5][0-9] "04", "08", "59"
M 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec'  
MM [0-1][0-9] "00", "12"
espace [ \t]  
ss ([0-5]?[0-9])|60 "04", "8", "59", "60" (seconde intercalaire)
SS [0-5][0-9] "04", "08", "59"
W "0"[1-9] | [1-4][0-9] | "5"[0-3] "05", "17", "53"
tzcorrection "GMT"? [+-] hh ":"? II? "+0400", "GMT-07:00", "-07:00"
YY [0-9]{4} "2000", "2008", "1978"
Notations localisées
Description Format Exemples
Format de log commun dd "/" M "/" YY : HH ":" II ":" SS space tzcorrection "10/Oct/2000:13:55:36 -0700"
EXIF YY ":" MM ":" DD " " HH ":" II ":" SS "2008:08:07 18:11:31"
Année ISO avec semaine ISO YY "-"? "W" W "2008W27", "2008-W28"
Année ISO avec semaine ISO et jour YY "-"? "W" W "-"? [0-7] "2008W273", "2008-W28-3"
MySQL YY "-" MM "-" DD " " HH ":" II ":" SS "2008-08-07 18:11:31"
PostgreSQL : Année avec jour de l'année YY "."? doy "2008.197", "2008197"
SOAP YY "-" MM "-" DD "T" HH ":" II ":" SS frac tzcorrection? "2008-07-01T22:35:17.02", "2008-07-01T22:35:17.03+08:00"
Unix Timestamp "@" "-"? [0-9]+ "@1215282385"
Unix Timestamp avec les microsecondes "@" "-"? [0-9]+ "." [0-9]{0,6} "@1607974647.503686"
XMLRPC YY MM DD "T" hh ":" II ":" SS "20080701T22:38:07", "20080701T9:38:07"
XMLRPC (Compact) YY MM DD 't' hh II SS "20080701t223807", "20080701T093807"
WDDX YY "-" mm "-" dd "T" hh ":" ii ":" ss "2008-7-1T9:3:37"

Note:

Le "W" dans les formats "Année ISO avec semaine ISO" et "Année ISO avec semaine ISO et jour" est sensible à la casse ; vous ne pouvez utiliser que la majuscule "W".

Le "T" dans les formats SOAP, XMRPC et WDDX est sensible à la casse ; utilisez toujours la majuscule "T".

Le format timestamp Unix définit le fuseau horaire à UTC.

Formats relatifs

Cette page décrit les différents formats dans une syntaxe de type BNF que les analyseurs de DateTimeImmutable, DateTime, date_create(), date_create_immutable(), et strtotime() comprennent.

Pour formatter des objets DateTimeImmutable et DateTime, veuillez vous référer à la documentation de la méthode DateTimeInterface::format().

Symboles utilisés
Description Format
dayname 'sunday' | 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'
daytext 'weekday' | 'weekdays'
number [+-]?[0-9]+
ordinal 'first' | 'second' | 'third' | 'fourth' | 'fifth' | 'sixth' | 'seventh' | 'eighth' | 'ninth' | 'tenth' | 'eleventh' | 'twelfth' | 'next' | 'last' | 'previous' | 'this'
reltext 'next' | 'last' | 'previous' | 'this'
space [ \t]+
unit 'ms' | 'µs' | (( 'msec' | 'millisecond' | 'µsec' | 'microsecond' | 'usec' | 'sec' | 'second' | 'min' | 'minute' | 'hour' | 'day' | 'fortnight' | 'forthnight' | 'month' | 'year') 's'?) | 'weeks' | daytext
Notations basées sur le jour
Format Description Exemples
'yesterday' Minuit d'hier "yesterday 14:00"
'midnight' Le temps est affecté à 00:00:00  
'today' Le temps est affecté à 00:00:00  
'now' Maintenant  
'noon' Le temps est affecté à 12:00:00 "yesterday noon"
'tomorrow' Minuit de demain  
'back of' hour 15 minutes avant l'heure précisée "back of 7pm", "back of 15"
'front of' hour 15 minutes après l'heure spécifiée "front of 5am", "front of 23"
'first day of'? Affecte le jour du premier jour du mois courant. Il est généralement préférable d'utiliser cette expression avec le nom du mois qui suit, car elle ne concerne que le mois en cours. "first day of January 2008"
'last day of'? Affecte le jour du dernier jour du mois courant. Il est généralement préférable d'utiliser cette expression avec le nom du mois qui suit, car elle ne concerne que le mois en cours. "last day of next month"
ordinal space dayname space 'of' Calcule le x-ème jour de semaine du mois en cours. "first sat of July 2008"
'last' space dayname space 'of' Calcule le dernier jour de semaine du mois en cours. "last sat of July 2008"
number space? (unit | 'week') Gère des temps relatifs dont la valeur est dénombrée. "+5 weeks", "12 day", "-7 weekdays"
(ordinal | reltext) space unit Gère les éléments temporels relatifs dont la valeur est un texte. last et previous sont équivalents à -1, this à 0, et next à +1. "fifth day", "second month", "last day", "previous year"
'ago' Utilise dans le passé toute description de temps relatif ('il y a'). "2 days ago", "8 days ago 14:00", "2 months 5 days ago", "2 months ago 5 days", "2 days ago"
dayname Se déplace vers le prochain jour indiqué.(Voir note) "Monday"
reltext space 'week' Gère le format spécial "weekday + last/this/next week". "Monday next week"

Note:

Les expressions relatives sont toujours traitées après les expressions non relatives. Ceci fait en sorte que "+1 week july 2008" et "july 2008 +1 week" sont équivalents.

"yesterday", "midnight", "today", "noon" et "tomorrow" sont des exceptions à cette règle. Notez que "tomorrow 11:00" et "11:00 tomorrow" sont différents. Soit la date d'aujourd'hui à "July 23rd, 2008", la première expression donne "2008-07-24 11:00" alors que la seconde donnera "2008-07-24 00:00". La raison est que ces cinq expressions influencent directement la date courante.

Les mots clés tel que "first day of" dépendent du contexte dans laquelle la chaîne de format relative est utilisé. Si utilisé avec une méthode statique ou une fonction, le référent est l'horodatage actuel du système. Cependant, si utilisé dans DateTime::modify() ou DateTimeImmutable::modify(), le référent est l'objet sur lequel la méthode modify() est appelée.

Note:

> Notez les remarques qui suivent lorsque le jour de semaine courant est le même que le jour de semaine utilisé dans la chaine de date/time. Le jour de semaine courant aurait pu être recalculé par rapport aux parties non relatives de la chaine date/time.

  1. "dayname" n'avance pas vers un autre jour. (Exemple : "Wed July 23rd, 2008" signifie "2008-07-23").
  2. "number dayname" n'avance pas vers un autre jour. (Exemple : "1 wednesday july 23rd, 2008" signifie "2008-07-23").
  3. "number week dayname" ajoutera d'abord le nombre de semaines, mais n'avancera pas vers un autre jour. Dans ce cas "number week" et "dayname" sont deux blocs distincts. (Exemple : "+1 week wednesday july 23rd, 2008" signifie "2008-07-30").
  4. "ordinal dayname" avance vers un autre jour. (Exemple : "first wednesday july 23rd, 2008" signifie "2008-07-30").
  5. "number week ordinal dayname" ajoutera d'abord le nombre de semaines et ensuite avancera vers un autre jour. Dans ce cas, "number week" et "ordinal dayname" sont deux blocs distincts. (Exemple : "+1 week first wednesday july 23rd, 2008" signifie "2008-08-06").
  6. "ordinal dayname 'of' " n'avance pas vers un autre jour. (Exemple : "first wednesday of july 23rd, 2008" signifie "2008-07-02" car la phrase avec 'of' remet à zéro le jour du mois vers '1' et le '23' sera ignoré).

Notez aussi que le "of" dans "ordinal space dayname space 'of' " et "'last' space dayname espace 'of' " fait quelque chose de spécial.

  1. Il affecte le jour du mois à 1.
  2. "ordinal dayname 'of' " n'avance pas vers un autre jour. (Exemple : "first tuesday of july 2008" signifie "2008-07-01").
  3. "ordinal dayname " avance vers un autre jour. (Exemple : "first tuesday july 2008" signifie "2008-07-08", voyez aussi le point numéro 4 de la liste ci-dessus).
  4. "'last' dayname 'of' " prend le dernier dayname du mois courant. (Exemple : "last wed of july 2008" signifie "2008-07-30")
  5. "'last' dayname" prend le dernier dayname à partir du jour actuel. (Exemple : "last wed july 2008" signifie "2008-06-25"; "july 2008" affecte d'abord la date courante à "2008-07-01" et ensuite "last wed" remonte au dernier mercredi qui est le "2008-06-25").

Note:

Les valeurs relatives des mois calculés sont basées sur le nombre de jours des mois que l'on utilise. Par exemple, "+2 month 2011-11-30", donnera comme résultat la date "2012-01-30". Ceci est du au fait que le mois de novembre comporte 30 jours, et que le mois de décembre en comporte 31, soit un ajout total de 61 jours.

Note:

number est un nombre entier ; si un nombre décimal est donné, le point (ou la virgule) sera probablement interprété comme un délimiteur. Par exemple, '+1.5 hours' sera analysé en tant que '+1 5 hours', et non pas comme '+1 hour +30 minutes'.

Historique

Version Description
8.2.0 number n'accepte plus plusieurs signes, exemple +-2.
7.0.8 Les semaines commencent toujours le lundi. Autrefois, le dimanche était également considéré pour commencer une semaine.

add a note add a note

User Contributed Notes 1 note

up
27
Ray.Paseur sometimes uses Gmail
8 years ago
When you've got external inputs that do not strictly follow the formatting and disambiguation rules, you may still be able to use the static method ::createFromFormat() to create a usable DateTime object

<?php
/**
* Date values separated by slash are assumed to be in American order: m/d/y
* Date values separated by dash are assumed to be in European order: d-m-y
* Exact formats for date/time strings can be injected with ::createFromFormat()
*/
error_reporting(E_ALL);

// THIS IS INVALID, WOULD IMPLY MONTH == 19
$external = "19/10/2016 14:48:21";

// HOWEVER WE CAN INJECT THE FORMATTING WHEN WE DECODE THE DATE
$format = "d/m/Y H:i:s";
$dateobj = DateTime::createFromFormat($format, $external);

$iso_datetime = $dateobj->format(Datetime::ATOM);
echo
"SUCCESS: $external EQUALS ISO-8601 $iso_datetime";

// MAN PAGE: http://php.net/manual/en/datetime.createfromformat.php
To Top