Be warned that DateTime object created without explicitely providing the time portion will have the current time set instead of 00:00:00.
<?php
$date = DateTime::createFromFormat('Y-m-d', '2012-10-17');
var_dump($date->format('Y-m-d H:i:s')); //will print 2012-10-17 13:57:34 (the current time)
?>
That's also why you can't safely compare equality of such DateTime objects:
<?php
$date1 = DateTime::createFromFormat('Y-m-d', '2012-10-17');
sleep(2);
$date2 = DateTime::createFromFormat('Y-m-d', '2012-10-17');
var_dump($date1 == $date2); //will be false
var_dump($date1 >= $date2); //will be false
var_dump($date1 < $date2); //will be true
?>
DateTime::createFromFormat
date_create_from_format
(PHP 5 >= 5.3.0)
DateTime::createFromFormat -- date_create_from_format — Retourne un nouvel objet DateTime formaté
Description
Style orienté objet
$format
, string $time
[, DateTimeZone $timezone
] )Style procédural
Retourne un nouvel objet DateTime formaté.
Liste de paramètres
-
format -
Le format à utiliser. Voir les options de formatage ci-dessous. Dans le plupart des cas, les mêmes lettres que pour la fonction date() peuvent être utilisées.
Les caractères suivants sont reconnus pour le paramètre formatformatcharacterDescription Exemple de valeurs analysées Jour --- --- d et j Jour du mois, sur 2 chiffres, avec ou sans le zéro initial 01 à 31 ou 1 à 31 D and l Une représentation textuelle du jour De Mon jusqu'à Sun ou de Sunday jusqu'à Saturday S Préfixe anglais du jour du mois, sur 2 caractères. Il sera ignoré lors de l'analyse. st, nd, rd ou th. z Le jour de l'année (en commençant à 0) 0 through 365 Mois --- --- F et M Une représentation textuelle du mois, comme January ou Sept De January à December ou de Jan à Dec m et n Une représentation numérique du mois, avec ou sans zéro initial De 01 à 12 ou de 1 à 12 Année --- --- Y Une représentation complète de l'année, sur 4 chiffres Exemples : 1999 ou 2003 y Une représentation partielle de l'année, sur 2 chiffres Exemples : 99 ou 03 Heure --- --- a et A Ante meridiem et Post meridiem am ou pm g et h L'heure au format 12-heures, avec ou sans zéro initial De 1 à 12 ou de 01 à 12 G et H L'heure au format 24-heures, avec ou sans zéro initial De 0 à 23 ou de 00 à 23 i Les minutes, avec un zéro initial De 00 à 59 s Les secondes, avec un zéro initial De 00 à 59 u Les microsecondes (jusqu'à 6 chiffres) Exemple : 45, 654321 Fuseau horaire --- --- e, O, P et T L'identifiant du fuseau horaire, ou la différence en heures avec UTC, ou la différence avec UTC avec deux points (:) entre les heures et les minutes, ou l'abréviation du fuseau horaire Exemples : UTC, GMT, Atlantic/Azores ou +0200 ou +02:00 ou EST, MDT Date/heure complète --- --- U Le nombre de secondes depuis l'époque Unix (January 1 1970 00:00:00 GMT) Exemple : 1292177455 Espace et séparateurs --- --- (espace) Un espace ou une tabulation Exemple : # Un des symboles de séparation suivants : ;, :, /, ., ,, -, ( ou ) Exemple : / ;, :, /, ., ,, -, ( ou ) Le caractère spécifié. Exemple : - ? Un octet aléatoire Exemple : ^ (Be aware that for UTF-8 characracters you might need more than one ?. In this case, using * is probably what you want instead) * Octets aléatoires jusqu'au prochain séparateur ou chiffre Exemple : * dans Y-*-d avec la chaîne 2009-aWord-08 trouvera la chaîne aWord ! Réinitialise tous les champs (année, mois, jour, heure, minute, seconde ainsi que les informations quant au fuseau horaire) à l'heure de l'époque Unix Sans le caractère !, tous les champs seront définis à la date et heure courante. | Réinitialise tous les champs (année, mois, jour, heure, minute, seconde ainsi que les informations quant au fuseau horaire) à l'heure de l'époque Unix s'ils n'ont pas encore été analysés Y-m-d| définira l'année, le mois et le jour avec les informations trouvées dans la chaîne analysée, mais aussi l'heure, les minutes et les secondes à 0. + Si le spécifieur de format est présent, les données restantes de la chaîne ne causeront pas une erreur, mais une alerte Utilisez la méthode DateTime::getLastErrors() pour identifier la présence de données restantes. Les caractères non reconnus dans le format feront échouer l'analyse et un message d'erreur sera ajouté à la structure retournée. Vous pouvez utiliser la méthode DateTime::getLastErrors() pour récupérer les messages d'erreur.
Si
formatn'est pas composé du caractère ! alors les valeurs de temps générées qui sont absentes deformatprendront comme valeur le temps système.Si
formatcontient le caractère !, alors les valeurs de temps générées qui sont absentes deformatainsi que les valeurs situées à gauche de ! prendront des valeurs mesurées depuis Unix epoch.Le début de l'époque Unix est le 01/01/1970 à 00:00:00 UTC.
-
time -
Chaîne représentant l'heure.
-
timezone -
Un objet DateTimeZone représentant le fuseau horaire désiré.
Si
timezoneest omis ettimene contient pas de fuseau, le fuseau courant sera utilisé.Note:
Le paramètre
timezoneet le fuseau courant sont ignorés lorsque le paramètretimecontient un timestamp (par ex 946684800) ou précise un fuseau (par ex 2010-01-28T15:00:00+02:00).
Valeurs de retour
Retourne un nouvel objet DateTime ou FALSE si une erreur survient.
Exemples
Exemple #1 Exemple avec DateTime::createFromFormat()
Style orienté objet
<?php
$date = DateTime::createFromFormat('j-M-Y', '15-Feb-2009');
echo $date->format('Y-m-d');
?>
Style procédural
<?php
$date = date_create_from_format('j-M-Y', '15-Feb-2009');
echo date_format($date, 'Y-m-d');
?>
Les exemples ci-dessus vont afficher :
2009-02-15
Exemple #2 Autres exemples avec DateTime::createFromFormat()
<?php
echo 'Date courante: ' . date('Y-m-d H:i:s') . "\n";
$format = 'Y-m-d';
$date = DateTime::createFromFormat($format, '2009-02-15');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";
$format = 'Y-m-d H:i:s';
$date = DateTime::createFromFormat($format, '2009-02-15 15:16:17');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";
$format = 'Y-m-!d H:i:s';
$date = DateTime::createFromFormat($format, '2009-02-15 15:16:17');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";
$format = '!d';
$date = DateTime::createFromFormat($format, '15');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";
?>
L'exemple ci-dessus va afficher quelque chose de similaire à :
Date courante: 2010-04-23 10:29:35 Format: Y-m-d; 2009-02-15 10:29:35 Format: Y-m-d H:i:s; 2009-02-15 15:16:17 Format: Y-m-!d H:i:s; 1970-01-15 15:16:17 Format: !d; 1970-01-15 00:00:00
Voir aussi
- DateTime::__construct() - Retourne un nouvel objet DateTime
- DateTime::getLastErrors() - Retourne les dernières erreurs et alertes
- checkdate() - Valide une date grégorienne
- strptime() - Analyse une date générée par strftime
It seems that a pipe ('|') option in formating string works only with PHP version 5.3.8 and newer. We had an issue with it on versions 5.3.2, 5.3.3, 5.3.6. Yet it was fine with 5.3.8 and 5.3.10.
By short example:
<?php
$timezone = new DateTimeZone('UTC');
$dateTime = DateTime::createFromFormat('dmY|', '01011972', $timezone);
//$dateTime is FALSE in PHP v <5.3.8
?>
Instead we used a workaround:
<?php
$dateTime = DateTime::createFromFormat('dmY', '01011972', $timezone);
$dateTime->format('Y-m-d 00:00:00');
?>
which works fine.
In order to use a DateTimeZone, don't enter one of the DateTimeZone::Europe, DateTimeZone::Asia etc. constants, but create a DateTimeZone object with verbal timezone name passed as a string:
<?php
$eventDate = DateTime::createFromFormat('m/d/y h:i', '02/26/11 08:00', new DateTimeZone('Europe/Warsaw'));
echo date_format($eventDate, 'Y-m-d'); //prints "2011-02-26"
?>
Not a bug, but a strange issue today 2012-08-30 :
<?php
$date = "2011-02";
echo $date."\n";
$d = DateTime::createFromFormat("Y-m",$date);
echo $d->format("Y-m");
?>
will display :
2011-02
2011-03
It's because there is no 2011-02-30, so datetime will take march insteed of february ...
To fix it :
<?php
$date = "2011-02";
echo $date."\n";
$d = DateTime::createFromFormat("Y-m-d",$date."-01");
echo $d->format("Y-m");
?>
This function seems to not support ISO 8601 format yet.
This fixe solves the problems:
use format : "Y-m-d\TH:i:sP"
Note that the U option does not support negative timestamps (before 1970). You have to use date for that.
Beware specifying a timezone in the format as it will take precedence over the DateTimeZone object.
<?php
$timezone = "UTC"; // or any other valid name for a timezone
$d= DateTime::createFromFormat("Y-m-d H:i:s T","2011-11-06 00:00:00 EDT",new DateTimeZone($timezone));
echo $d->format("Y-m-d H:i:s T - U");
// returns "2011-11-06 00:00:00 EDT - 1320552000"
// specifying $timezone = "Pacific/Honolulu"; would return the same string
?>
This gets hairy when you are playing with transition from summer time to winter time! For instance, in Toronto, the time change happens on 2011-11-06. One second after 01:59:59 (EDT), the time becomes 01:00:00 (EST), or 1320559200 in Unix timestamp.
However, notice the following:
<?php
$d = DateTime::createFromFormat("Y-m-d H:i:s","2011-11-06 01:00:00",new DateTimeZone("EST"));
echo $d->format("Y-m-d H:i:s T U");
// returns "2011-11-06 01:00:00 EDT 1320555600" instead of "2011-11-06 01:00:00 EST 1320559200"
// so the correct way is to do:
$d = DateTime::createFromFormat("Y-m-d H:i:s T","2011-11-06 01:00:00 EST",new DateTimeZone($timezone)); // set $timezone to any valid string for DateTimeZone, it doesn't matter
echo $d->format("Y-m-d H:i:s T U");
// returns "2011-11-06 01:00:00 EST - 1320559200" as wanted
?>
You can use the ISO8601 constant instead:
$date = DateTime::createFromFormat(DateTime::ISO8601, date("c"))
You can view the other constants at:
http://php.net/manual/en/class.datetime.php
