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";
}
}