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.ini date_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";
	}
}