Aller au contenu principal

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èreSignificationExemple
dJour du mois, sur 2 chiffres25
mMois, sur 2 chiffres08
YAnnée, sur 4 chiffres2026
HHeure (format 24h)14
iMinutes30
sSecondes05
lNom complet du jour de la semaine (en anglais)Tuesday
info

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.

remarque

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 : vaut 1 si la première date est après la seconde (intervalle "négatif"), 0 sinon.
$examDate = new DateTime('2026-09-15');
$today = new DateTime();

$interval = $today->diff($examDate);
echo "Il reste " . $interval->days . " jours avant l'examen.";
astuce

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";
info

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


Quelle fonction PHP (non orientée objet) permet d'afficher la date du jour selon un format donné ?


Quel caractère de format donne le jour du mois sur 2 chiffres avec date() ?


Quel caractère de format donne l'année sur 4 chiffres avec date() ?


Comment crée-t-on un objet représentant la date et l'heure actuelles avec la classe DateTime ?


Quelle méthode de l'objet DateTime permet de l'afficher dans un format choisi ?


Quelle méthode permet de déplacer une date, par exemple lui ajouter des jours ?


Quelle méthode permet de calculer la différence entre deux objets DateTime ?


Quel type d'objet est renvoyé par la méthode diff() ?


Dans un objet DateInterval, quelle propriété contient le nombre d'années entières entre 2 dates ?


Parmi les affirmations suivantes sur DateTime, lesquelles sont vraies ?


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.


Bonne pratique - Toujours utiliser le format AAAA-MM-JJ pour créer une DateTime

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.


Bonne pratique - Séparer la donnée et son affichage

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


Bonne pratique - Utiliser days pour un nombre total de jours

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é.


Bonne pratique - Ne jamais présumer qu'une date est dans le futur

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".

📌 Une solution