PHP transformer un string en date et subtilité de now()
DateTime::createFromFormat()
La Méthode statique DateTime::createFromFormat() est très intéressante car elle permet :
- de transformer une chaine de caractère en date
- quelquesoit le format de la chaine : français jj/mm/aaaa ou anglais mm/jj/aaaa
$d = "10/01/2017-20:30"; $dt = DateTime::createFromFormat('d/m/Y-H:i',$d); print_r($dt);
DateTime() et la méthode getTimeStamps()
Après avoir créer une date à partir d’une chaine de caractère, il est intéressant de la convertir en nombre à partir de 1970 : la méthode getTimeStamps()
$d = "10/01/2016-20:30"; $dt = DateTime::createFromFormat('d/m/Y-H:i',$d); $dt_stamp = $dt->getTimeStamps(); print_r($dt_stamp);
now et fuseau horaire
La fonction now()
est simple d’utilisation mais elle peut conduire à des erreurs car :
- il faut lui préciser le fuseau horaire aussi appelé TimeZone
- sinon
now()
va retourner la date de maintenant sur fuseau horaire défini dans php.inidate_default_timezone_get ()
- dans php.ini, il s’agit de la directive
date.timezone
- sur mon serveur le fuseau horaire par défaut est le méridien de Greenwich : la zone UTC
Je vais donc préférer à now()
, l’objet new DateTime("now")
:
// now UTC sur ma version de php $nowFuseauInconnu = new DateTime("now"); print_r($nowFuseauInconnu); // now Paris méthode 1 $tz = new DateTimeZone('Europe/Paris'); $nowParis1 = new DateTime("now"); $nowParis1->setTimezone($tz); print_r($nowParis1); // now Paris méthode 2 $nowParis2 = new DateTime("now Europe/Paris"); print_r($nowParis2); // now Paris méthode 3 $nowParis3 = new DateTime("now",new DateTimeZone('Europe/Paris')); print_r($nowParis3);
Astuce : connaitre la timezone par défaut de php.ini
print_r(date_default_timezone_get ()); // connaitre la timezone par défaut de php.ini
Astuce : récupérer tous les libellés des times zones
print_r(DateTimeZone::listIdentifiers()); // astuce pour récupérer tous les libellés des times zones
Comparer maintenant par rapport à deux dates
Voici une fonction maison qui permet de comparer maintenant par rapport à deux dates en utilisant tous les concepts vues précédemment :
/* * $dt_start : string au format 'd/m/Y-H:i' * $dt_end : string au format 'd/m/Y-H:i' * return : string "before","while","after","error" */ function comparer_date($dt_start,$dt_end){ $r = $dt_start; $start = DateTime::createFromFormat('d/m/Y-H:i', $r); $s = $start->getTimestamp(); $r = $dt_end; $end = DateTime::createFromFormat('d/m/Y-H:i', $r); $e = $end->getTimestamp(); $tz = new DateTimeZone('Europe/Paris'); $now = new DateTime("now"); $now->setTimezone($tz); $n = $now->getTimestamp (); if($n < $s){ return "before"; }else if( $n >= $s && $n <= $e){ return "while"; }else if($n > $e){ return "after"; }else{ return "error"; } }