Manipulation des dates et des heures en PHP

Venez apprendre comment manipuler efficacement les dates en PHP. Maîtrisez le formatage de la date suivant la région. Modifier, analyser et comparer deux dates facilement.

  Publié le

À quoi sert l'objet DateTime en PHP ?

L'objet DateTime permet de connaître la date du jour, d'initialiser une date spécifique, d'initialiser une date par rapport à une région. De créer une date relative par rapport a la date actuelle. De modifier une date par rapport à des critères (ajout, suppression de jour, d'heure,de minute ou de seconde). Il est possible de modifier le format de restitution de la date pour correspondre aux critères spécifiques d'un pays. L'objet DateTime s'appuie sur le principe de "timestamp" qui est la représentation du nombre de secondes écoulées depuis le 1er janvier 1970 à minuit (UTC) précis. Ce concept est particulièrement important à garder à l'esprit étant donné que c'est grâce à lui que la manipulation, la comparaison et le stockage des dates sont ainsi rendus universels.

Pour l'exemple : le 25/05/2021 16:01:08 à pour timestamp 1621958468.

Comment initialiser la date et l'heure de l'instant en PHP ?

L'initialisation de la date du jour à l'aide de l'objet DateTime s'effectue à l'aide du constructeur de l'objet DateTime avec pour paramètre "now".

$now =  new \DateTime('now');

/** 
    object(DateTime)#1 (3)
	{ 
		["date"]=> string(26) "2021-05-25 07:35:31.864977" 
		["timezone_type"]=> int(3) 
		["timezone"]=> string(3) "UTC" 
	} 
*/

Comment afficher la date au format souhaitée en PHP ?

Pour formater la date et l'objet DateTime pour répondre à un format spécifique, il suffit d'utiliser la fonction "format" de notre objet DateTime précédemment créée et de lui spécifier un modèle de restitution.

$now =  new \DateTime('now');
$str_date_us = $now->format('Y-m-d');

Pour les principaux formats utilisés dans le web francophone.

Date anglaise sans l'heure (compatible avec un champ date dans une base de données MySQL) : 

$str_date = $now->format('Y-m-d');

Date anglaise avec l'heure (compatible avec un champ datetime dans une base de données MySQL) :

$str_datetime = $now->format('Y-m-d H:i:s');

Date française sans l'heure :

$str_date = $now->format('d-m-Y');

Date française avec l'heure :

$str_datetime = $now->format('d-m-Y H:i:s');

Comment garantir qu'une chaine de caractères corresponde à une date valide en PHP ?

La fonction checkdate permet de garantir qu'une date est valide. Elle prend trois arguments, le mois (valeur comprise entre 1 et 12), le jour (date présente dans le mois,incluant la gestion des années bissextiles), et l'année (valeur comprise entre 1 et 32767). La fonction checkdate retourne un boolean.

$good = checkdate(5,15,2021);
$bad = checkdate(2,31,2021);

Comment initialiser l'objet DateTime en PHP avec une date et une heure spécifique ?

L'initialisation de la date du jour à l'aide de l'objet DateTime s'effectue à l'aide du constructeur de l'objet DateTime avec pour paramètre une date répondant au format Y-m-d H:i:s.

/**Premièr jour de 2021 */
$first_day_2021 = new \DateTime(date("Y") . "-01-01 00:00:01");

/**Date du jour de la publication  */
$datetime_demo = new \DateTime("2021-05-25 18:37:27");

Comment comparer deux dates en PHP pour définir un écart ?

Pour comparer deux dates en PHP en utilisant l'objet DateTime il suffit dans un premier temps d'initialiser deux objets DateTime avec les deux dates dont nous souhaitons obtenir l'écart.

Puis nous appelons la fonction "diff" sur l'objet DateTime qui doit servir de référence pour l'analyse différentielle. Le résultat de cette fonction est un objet DateInterval. Pour avoir une donnée exploitable, nous la formatons selon nos besoins. À l'aide de la fonction "format" en lui précisant une unité de restitution.


$Start =  new \DateTime("2021-05-01 00:00:01");
$End = new \DateTime("2021-06-01 00:00:01");
$Delais = $Start->diff($End);

/**
Soit : 31 jours positif 
object(DateInterval)#3 (16) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(1)
  ["d"]=>
  int(0)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["f"]=>
  float(0)
  ["weekday"]=>
  int(0)
  ["weekday_behavior"]=>
  int(0)
  ["first_last_day_of"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  int(31)
  ["special_type"]=>
  int(0)
  ["special_amount"]=>
  int(0)
  ["have_weekday_relative"]=>
  int(0)
  ["have_special_relative"]=>
  int(0)
}
*/

$Delais = $End->diff($Start);
/**
Soit : 31 jours négatifs notés la valeur de invert qui diffère 
object(DateInterval)#3 (16) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(1)
  ["d"]=>
  int(0)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["f"]=>
  float(0)
  ["weekday"]=>
  int(0)
  ["weekday_behavior"]=>
  int(0)
  ["first_last_day_of"]=>
  int(0)
  ["invert"]=>
  int(1)
  ["days"]=>
  int(31)
  ["special_type"]=>
  int(0)
  ["special_amount"]=>
  int(0)
  ["have_weekday_relative"]=>
  int(0)
  ["have_special_relative"]=>
  int(0)
}
*/

Comment trier des dates en PHP ?

Pour trier plusieurs objets DateTime il suffit de les ajouter dans un tableau et de générer un second tableau qui contiendra la représentation timestamp de l'objet DateTime puis d'utiliser la fonction "array_multisort" qui classera le premier tableau par rapport au second. On notera l'utilisation de la constante SORT_ASC pour trier dans l'ordre ascendant, qui peut parfaitement être remplacé par la constante SORT_DESC pour trier les DateTime dans l'ordre descendant.

$list_dates = array(
				new \DateTime('now'),
				new \DateTime("2021-02-01 00:00:01"),
				new \DateTime("2021-03-01 00:00:01"),
				new \DateTime("2021-06-01 00:00:01")
                  );

$ref_sort = array();
foreach ($list_dates as $index => $datetime){
    $ref_sort[] = strtotime($datetime->format('Y-m-d H:i:s'));
}

/**Trie list_dates par rapport à ref_sort dans l'ordre ascendant */
array_multisort($ref_sort, SORT_ASC, $list_dates);

/**Trie list_dates par rapport à ref_sort dans l'ordre descendant */
array_multisort($ref_sort, SORT_DESC, $list_dates);

Comment modifier une date en PHP ?

L'objet DateTime dispose d'une fonction "modify" qui permet de modifier le timestamp de la date par rapport à un opérateur (+ ou -) et une unité (year,month,day,hour,minute,seconde).Nous pouvons donc à l'aide de cette méthode incrémenter grâce à l'opérateur plus ou décrémenter à avec l'opérateur moins le timestamp de notre objet DateTime.

$datetime = new \DateTime("2021-02-01 00:00:01");
$datetime->modify("+2 years");
$str_datetime = $datetime->format("Y-m-d H:i:s");
echo $str_datetime; /**Affiche : 2023-02-01 00:00:01 */

$datetime->modify("+10 months");
$str_datetime = $datetime->format("Y-m-d H:i:s");
echo $str_datetime; /**Affiche : 2023-02-01 10:00:01 */

$datetime->modify("+50 hours");
$str_datetime = $datetime->format("Y-m-d H:i:s");
echo $str_datetime; /**Affiche : 2023-12-03 02:00:01 */

$datetime->modify("+5 minutes");
$str_datetime = $datetime->format("Y-m-d H:i:s");
echo $str_datetime; /**Affiche : 2023-12-03 02:05:01 */

$datetime->modify("-5 minutes");
$str_datetime = $datetime->format("Y-m-d H:i:s");
echo $str_datetime; /**Affiche : 2023-12-03 02:00:01 */

$datetime->modify("+10 secondes");
$str_datetime = $datetime->format("Y-m-d H:i:s");
echo $str_datetime; /**Affiche : 2023-12-03 02:00:11 */

Comment définir le décalage horaire en PHP ?

Pour assigner la zone qui définit le décalage horaire en PHP on utilisera la fonction date_default_timezone_set avec pour seul paramètre l'identifiant valide du fuseau horaire souhaité.

date_default_timezone_set("Europe/Paris");