Les dates avec DateTime
Notions théoriques
La fonction date()
PHP fournit la fonction date() pour afficher la date et l'heure actuelles, selon un format que vous choisissez.
echo date("d/m/Y"); // Affiche par exemple : 25/08/2026
echo date("H:i:s"); // Affiche par exemple : 14:30:05
Quelques caractères de format parmi les plus utilisés :
| Caractère | Signification | Exemple |
|---|---|---|
d | Jour du mois, sur 2 chiffres | 25 |
m | Mois, sur 2 chiffres | 08 |
Y | Année, sur 4 chiffres | 2026 |
H | Heure (format 24h) | 14 |
i | Minutes | 30 |
s | Secondes | 05 |
l | Nom complet du jour de la semaine (en anglais) | Tuesday |
date() est très pratique pour afficher la date du moment présent. Mais dès que l'on souhaite manipuler une date précise (une date de naissance, une date d'examen...), il devient plus pratique d'utiliser la classe DateTime.
La classe DateTime
PHP fournit un outil orienté objet, la classe DateTime, pour représenter et manipuler des dates.
Vous n'avez pas encore étudié la programmation orientée objet (POO) en détail : ce sera l'objet d'un prochain cours. Pour cette séance, considérez simplement DateTime comme un outil prêt à l'emploi que l'on utilise avec le mot-clé new, sans avoir besoin de comprendre son fonctionnement interne.
// Créer un objet représentant la date et l'heure actuelles
$now = new DateTime();
// Créer un objet représentant une date précise
$examDate = new DateTime('2026-09-15');
Une fois l'objet créé, la méthode format() permet de l'afficher selon le format souhaité, avec les mêmes caractères de format que la fonction date().
$examDate = new DateTime('2026-09-15');
echo $examDate->format('d/m/Y'); // Affiche : 15/09/2026
Modifier une date avec modify()
La méthode modify() permet de déplacer une date dans le temps, en lui indiquant une expression comme '+1 day', '-2 weeks' ou '+1 month'.
$date = new DateTime('2026-08-25');
$date->modify('+7 days');
echo $date->format('d/m/Y'); // Affiche : 01/09/2026
Calculer une durée avec DateInterval et diff()
Pour calculer la différence entre deux dates (par exemple pour calculer un âge ou une durée), on utilise la méthode diff(), qui compare deux objets DateTime et renvoie un objet DateInterval.
$birthDate = new DateTime('2005-03-15');
$today = new DateTime();
$interval = $birthDate->diff($today);
echo $interval->y . " ans, " . $interval->m . " mois et " . $interval->d . " jours.";
L'objet DateInterval renvoyé par diff() contient plusieurs propriétés utiles :
y: le nombre d'années entières de l'intervalle.m: le nombre de mois restants (après avoir compté les années).d: le nombre de jours restants (après avoir compté les années et les mois).days: le nombre total de jours entre les deux dates, tous calculés ensemble.invert: vaut1si la première date est après la seconde (intervalle "négatif"),0sinon.
$examDate = new DateTime('2026-09-15');
$today = new DateTime();
$interval = $today->diff($examDate);
echo "Il reste " . $interval->days . " jours avant l'examen.";
Utilisez $interval->days (avec un "s") pour obtenir un nombre total de jours, et $interval->d (sans "s") pour obtenir uniquement le reste de jours après avoir compté les années et les mois.
Exemple pratique
<?php
// Calcul de l'âge à partir d'une date de naissance
$birthDate = new DateTime('2005-03-15');
$today = new DateTime();
$age = $birthDate->diff($today);
echo "Date de naissance : " . $birthDate->format('d/m/Y') . "\n";
echo "Date du jour : " . $today->format('d/m/Y') . "\n";
echo "Vous avez " . $age->y . " ans.\n";
// Calcul d'une date limite, une semaine après aujourd'hui
$deadline = new DateTime();
$deadline->modify('+7 days');
echo "Date limite : " . $deadline->format('d/m/Y') . "\n";
Dans cet exemple, diff() renvoie un objet DateInterval dont la propriété y donne directement le nombre d'années complètes entre les deux dates : c'est exactement le calcul d'un âge.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Vous développez une page qui affiche des informations sur un examen à venir : sa date au format français, et le nombre de jours restants avant qu'il ait lieu.
- Dans votre répertoire "Documents", créez le répertoire
tp_dates. - Créez le fichier
examen.php.
Étape 1 — Créer un objet DateTime représentant la date de l'examen
L'examen a lieu le 15 septembre 2026.
Lorsque vous créez une DateTime à partir d'une date écrite en dur dans le code, préférez le format 'AAAA-MM-JJ' (par exemple '2026-09-15') : il est interprété sans ambiguïté par PHP, contrairement à un format comme '15/09/2026' qui peut être mal interprété selon la configuration du serveur.
Étape 2 — Formater la date de l'examen en français
Il faut afficher la date au format jour/mois/année, par exemple 15/09/2026.
Conservez toujours vos dates sous forme d'objets DateTime, et n'appelez format() qu'au moment de l'affichage. Cela vous permet de continuer à faire des calculs sur la date (avec diff() ou modify()) sans être gêné par une chaîne de texte déjà formatée.
Étape 3 — Calculer le nombre de jours restants avant l'examen
Pour afficher un nombre total de jours entre deux dates, utilisez $interval->days (avec un "s"). La propriété $interval->d ne contient que le reste de jours après avoir compté les années et les mois complets : elle ne convient pas pour ce calcul.
Étape 4 — Afficher un message différent selon que l'examen est passé ou à venir
La propriété invert de l'objet DateInterval vaut 1 lorsque la première date ($today) est après la seconde ($examDate), c'est-à-dire lorsque l'examen est déjà passé.
Lorsque vous calculez un intervalle avec diff(), n'oubliez pas que la date de comparaison peut très bien être passée. Vérifier la propriété invert évite d'afficher un message absurde comme "il reste -12 jours".