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)';
?>
Cette page a été générée le 25/12/2024 à 19:51:15 (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)
Sans le caractère d'échappement devant 'h'
Cette page a été générée le 25/12/2024 à 190751 (heure locale)
Avec le caractère d'échappement devant 'h'
Cette page a été générée le 25/12/2024 à 19h51 (heure locale)
|
- 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)
Cette page a été générée le 25 December 2024 à 19:51 (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');
?>
La date 2030-02-01 convertie au format Français donne 01/02/2030
|
- 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');?>
Pas de doute, il s'agit bien de la date 01/02/2030
|
- 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";
?>
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";
?>
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)