6.Le langage PHP

6.10.Les dates

6.10.3.Les classes PHP

6.10.3.1.Déterminer la date et heure courante

Pour déterminer la date et l'heure courante, il suffit d'instancier un objet DateTime sans aucun paramètre.
<?php
$maintenant = new DateTime();
?>

6.10.3.2.Formatter (i.e. afficher/retourner) une date

Un objet DateTime peut-être retourné sous différents formats grâce à la méthode format(). Celle-ci prend un seul paramètre qui est une chaîne de caractères précisant sous quelle forme doit être retournée la date. Le format est défini par concaténation de caractères "libres" et de "mots" clés. Les mots clés sont identiques à ceux utilisés par la fonction date()[en savoir plus].
Ainsi dans l'exemple suivant d représente le jour du mois, m le mois de l'année, Y l'année, H l'heure, i les minutes et s les secondes. Les '/', ':' et ' à ' sont quant à eux, des caractères "libres".
<?php
$maintenant = new DateTime();
echo 'Cette page a été générée le '. $maintenant->format('d/m/Y à H:i:s').' (heure locale)';
?>
Télécharger format.php

Ce qui donne:
Cette page a été générée le 23/03/2019 à 20:37:33 (heure locale)
Il peut arriver que l'on veuille intégrer dans le format du texte qui se trouve être également un "mot clé". Comme par exemple avec 'h' pour le diminutif de 'heure' qui se trouve être également le mot clé pour l'heure sur un format de 12h. Dans ce cas, il faut faire précéder le "mot" clé par le caractère d'échappement '\' (anti-slash).
<?php
$maintenant = new DateTime();
?>
Sans le caractère d'échappement devant 'h'
Cette page a été générée le <?php echo $maintenant->format('d/m/Y à Hhi');?> (heure locale)
Avec le caractère d'échappement devant 'h'
Cette page a été générée le <?php echo $maintenant->format('d/m/Y à H\hi');?> (heure locale)
Télécharger format_2.php

Ce qui donne:
Sans le caractère d'échappement devant 'h'
Cette page a été générée le 23/03/2019 à 200837 (heure locale)
Avec le caractère d'échappement devant 'h'
Cette page a été générée le 23/03/2019 à 20h37 (heure locale)
rem
  • Tout comme la fonction date(), la méthode format() ne tient pas compte de la "locale". Les données textuelles des dates seront donc systématiquement en anglais
    <?php
    setLocale(LC_TIME, 'fr_FR.utf8');
    $maintenant = new DateTime();
    ?>
    Cette page a été générée le <?php echo $maintenant->format('d F Y à H:i');?> (heure locale)
    
    Télécharger format_en.php

    Ce qui donne:
    Cette page a été générée le 23 March 2019 à 20:37 (heure locale)
    

6.10.3.3.Manipuler une date quelconque

6.10.3.3.1.Introduction

Nous avons attaqué ce chapitre en évoquant le cas de la date et heure courante. Pour cela nous avons instancié un objet DateTime sans paramètre mais il est possible de manipuler (presque) n'importe quelle date
  • soit en passant pour premier paramètre la date voulue. Il faudra toutefois veiller à ce que le format de la date passée en paramètre soit supporté
  • soit en faisant appel à la méthode createFromFormat() pour un format de date quelconque (en dehors des dates sous forme de texte s'ils ne sont pas rédigés en Anglais)

6.10.3.3.2.Format ISO ou proche

Le format le plus sûr étant encore le format "année-mois-jour heure:minutes:secondes". Le format Français "jour/mois/année heure:minutes:secondes" n'est quant à lui pas supporté. Tout comme les données textuelles autres qu'en Anglais (quelque soit la "locale" sélectionnée).
<?php
$date = '2030-02-01';
$dateTime = new DateTime($date);
echo 'La date '.$date.' convertie au format Français donne '.$dateTime->format('d/m/Y');
?>
Télécharger datetime.php

Ce qui donne:
La date 2030-02-01 convertie au format Français donne 01/02/2030
rem
  • Si le format de la date est invalide une exception sera levée
  • Si le format est correcte mais la date invalide, la date peut être interprétée comme une date valide "proche" de la date saisie ou une exception peut être levée. Ainsi le 2018-02-29 est converti en 2018-03-01 tandis qu'une exception est levée pour 2000-12-32. Ce constructeur ne peut donc pas être utilisé pour contrôler la validité d'une date.

6.10.3.3.3.Format "Français" jj/mm/aaaa

Pour instancier un objet DateTime sur la base d'une date au format Français "jour/mois/année" éventuellement complété de l'heure vous pouvez néanmoins vous appuyer sur la méthode statique createFromFormat(). En effet, celle-ci permet de préciser sous quel format est écrite la date. Il n'y a alors pas de confusion possible (par exemple avec une date au format Américain mm/jj/aaaa)
<?php
$date = '01/02/2030';
$dateTime = DateTime::createFromFormat('d/m/Y', $date);
?>
Pas de doute, il s'agit bien de la date <?php echo $dateTime->format('d/m/Y');?>
Télécharger createFromFormat.php

Ce qui donne:
Pas de doute, il s'agit bien de la date 01/02/2030
rem
  • En cas de format invalide, la méthode retourne false (elle ne lève pas d'Exception)
  • En cas de date incorrecte (ex: 31/12/2000 ou 29/02/2018), la méthode retourne tout de même une date. Elle ne peut donc pas être utilisée pour contrôler la validité d'une date

6.10.3.3.4.Date sous forme de texte

Pour une date sous forme de texte en Français (ex: "12 septembre 2020"), il faudra trouver une autre solution comme strptime()[en savoir plus].

6.10.3.4.Contrôler la validité d'une date

La classe DateTime ne permet pas aisément de vérifier la validité d'une date. Vous pourriez à la place être tenté par l'utilisation de la fonction checkdate()[en savoir plus]

6.10.3.5.Ajouter/Soustraire du temps à une date

Pour effectuer une opération sur une date donnée, il faut commencer par définir l'intervalle de temps que l'on souhaite y ajouter ou soustraire. Pour cela, vous devez instancier un objet DateInterval en lui passant en paramètre une chaîne de caractères décrivant la durée de cet intervalle de temps. Cette chaîne se construit en concaténant:
  • la lettre 'P'
  • éventuellement un nombre d'année suivi de la lettre 'Y'
  • éventuellement un nombre de mois suivi de la lettre 'M'
  • éventuellement un nombre de jours suivi de la lettre 'D' ou un nombre de semaines suivi de la lettre 'W'
  • la lettre 'T' si vous souhaitez préciser des heures, minutes et/ou secondes
  • éventuellement un nombre d'heures suivi de la lettre 'H'
  • éventuellement un nombre de minutes suivi de la lettre 'M'
  • éventuellement un nombre de secondes suivi de la lettre 'S'
<?php
// 1 an
$p1 = new DateInterval('P1Y');
// 1 an 2 mois et 4 jours
$p2 = new DateInterval('P1Y2M4D');
// 2 jours et 3 heures
$p3 = new DateInterval('P2DT3H');
// 2 jours, 3 heures, 10 minutes et 30 secondes
$p4 = new DateInterval('P2DT3H10M30S');
?>
Ensuite, il suffit de faire appel aux méthodes add() (resp. sub()) de l'objet DateTime pour ajouter (resp. soustraire) cette intervalle de temps à la date.
<?php
$date = new DateTime('2030-01-01 00:00:00');
echo 'Je commence avec '.$date->format('d/m/Y à H:i:s').' (heure locale)'."\n";
$p1j = new DateInterval('P1D');
$date->add($p1j);
echo 'J\'ajoute 1 jour '.$date->format('d/m/Y à H:i:s').' (heure locale)'."\n";
$p = new DateInterval('P1DT2H3M');
$date->add($p);
echo 'J\'ajoute 1 jour, 2 heures et 3 minutes '.$date->format('d/m/Y à H:i:s').
     ' (heure locale)'."\n";
$date->sub($p1j);
echo 'Je soustrais 1 jour '.$date->format('d/m/Y à H:i:s').' (heure locale)'."\n";
?>
Télécharger add_et_sub.php

Ce qui donne:
Je commence avec 01/01/2030 à 00:00:00 (heure locale)
J'ajoute 1 jour 02/01/2030 à 00:00:00 (heure locale)
J'ajoute 1 jour, 2 heures et 3 minutes 03/01/2030 à 02:03:00 (heure locale)
Je soustrais 1 jour 02/01/2030 à 02:03:00 (heure locale)
L'appel à ce type de méthodes n'est véritablement pas superflux lorsqu'il s'agit de manipuler des dates. Il est en effet important de noter, par exemple, qu'ajouter 1 jour n'est pas équivalent à ajouter 24h.
<?php
$date = new DateTime('2019-10-26 11:00:00', new DateTimeZone('Europe/Paris'));
echo 'La veille du passage à l\'heure d\'hiver à '.$date->format('d/m/Y à H:i:s').
     ' (heure Paris)'."\n";
$p1j = new DateInterval('P1D');
$date->add($p1j);
echo '1 jour plus tard il est: '.$date->format('d/m/Y à H:i:s').' (heure Paris)'."\n";

$date = new DateTime('2019-10-26 11:00:00', new DateTimeZone('Europe/Paris'));
$p = new DateInterval('PT24H');
$date->add($p);
echo 'Tandis que 24h plus tard il est: '.$date->format('d/m/Y à H:i:s').
     ' (heure Paris)'."\n";
?>
Télécharger add_et_sub_24h.php

Ce qui donne:
La veille du passage à l'heure d'hiver à 26/10/2019 à 11:00:00 (heure Paris)
1 jour plus tard il est: 27/10/2019 à 11:00:00 (heure Paris)
Tandis que 24h plus tard il est: 27/10/2019 à 10:00:00 (heure Paris)
Ici vous pouvez apprendre :
Forum PHP
Version imprimable: imprimer