Date et heure en PHP
Apprenez à travailler avec les dates en PHP : formatez avec date(), définissez le fuseau horaire, analysez des chaînes avec strtotime() et DateTime.
Presque toutes les applications web doivent gérer des dates et des heures : horodatages sur les publications, dates d'expiration, libellés « il y a 3 jours », planification, journalisation. PHP vous offre deux outils complémentaires pour cela — la famille de fonctions procédurales date() pour un formatage rapide, et la classe orientée objet DateTime pour une arithmétique de dates plus sûre et plus puissante.
Ce chapitre vous montre comment afficher la date actuelle, contrôler le fuseau horaire, convertir des chaînes lisibles par l'homme en timestamps, et calculer la différence entre deux dates — ainsi que les pièges courants à éviter.
Comment PHP représente le temps
En coulisses, PHP stocke un instant sous forme de timestamp Unix : le nombre de secondes écoulées depuis minuit UTC le 1er janvier 1970. time() retourne le timestamp actuel, et la plupart des fonctions de date en acceptent un en entrée :
<?php
echo time(); // e.g. 1750464000 (an integer)
echo date("Y-m-d"); // turns "now" into a readable string
?>Un timestamp est indépendant du fuseau horaire — il représente le même instant partout sur Terre. Le fuseau horaire n'a d'importance que lorsque vous formatez cet instant en chaîne lisible par l'homme, c'est pourquoi il est important de définir correctement le fuseau horaire (voir ci-dessous).
Utilisation de base de date()
La fonction date() convertit un timestamp en chaîne formatée :
date(string $format, ?int $timestamp = null): string$formatest une chaîne de codes de format décrivant l'apparence de la sortie.$timestampest facultatif. Si vous l'omettez,date()utilise l'heure actuelle.
Voici la date actuelle au format jj/mm/aaaa :
Tout caractère qui n'est pas un code de format est affiché littéralement, vous pouvez donc mélanger des séparateurs et du texte :
<?php
echo date("l, F j, Y"); // e.g. Saturday, June 21, 2025
echo "\n";
echo date("Y-m-d H:i:s"); // e.g. 2025-06-21 14:30:05
?>Codes de format
date() accepte des dizaines de caractères de format. Voici ceux que vous utiliserez le plus souvent :
| Code | Signification | Exemple |
|---|---|---|
d | Jour du mois, 2 chiffres | 01 – 31 |
j | Jour du mois, sans zéro initial | 1 – 31 |
D | Nom du jour, abrégé | Mon – Sun |
l | Nom du jour, complet | Monday – Sunday |
m | Mois, 2 chiffres | 01 – 12 |
n | Mois, sans zéro initial | 1 – 12 |
M | Nom du mois, abrégé | Jan – Dec |
F | Nom du mois, complet | January – December |
Y | Année, 4 chiffres | 2025 |
y | Année, 2 chiffres | 25 |
H | Heure, format 24h, 2 chiffres | 00 – 23 |
h | Heure, format 12h, 2 chiffres | 01 – 12 |
i | Minutes, 2 chiffres | 00 – 59 |
s | Secondes, 2 chiffres | 00 – 59 |
A | AM / PM | AM, PM |
U | Timestamp Unix | 1750464000 |
Pour afficher une lettre qui correspond à un code de format (par exemple un H littéral), échappez-la avec une barre oblique inverse : date('\H:i').
Définir le fuseau horaire
date() formate les heures selon le fuseau horaire par défaut du serveur. S'appuyer sur le fuseau horaire par défaut du serveur est une source fréquente de bugs du type « l'heure est décalée de quelques heures ». Définissez explicitement le fuseau horaire en haut de votre script (ou dans php.ini) :
<?php
date_default_timezone_set("America/New_York");
echo date("Y-m-d H:i:s"); // formatted for New York time
?>Utilisez les noms de fuseaux horaires IANA tels que Europe/London, Asia/Tokyo ou UTC. Pour un aperçu de la façon dont PHP gère les régions et l'heure d'été, consultez le chapitre Fuseaux horaires PHP.
Analyser des chaînes en timestamps
Lorsqu'une date arrive sous forme de texte — depuis un formulaire, une API ou une base de données — strtotime() la convertit en timestamp que vous pouvez formater ou utiliser dans des calculs. Elle comprend à la fois les dates absolues et les expressions relatives en anglais :
strtotime() est tolérante mais ambiguë. Une chaîne comme 01/02/2022 est lue comme mois/jour (style américain). Pour une analyse prévisible d'un format connu, préférez DateTime::createFromFormat() (ci-dessous). Lorsque strtotime() ne peut pas comprendre l'entrée, elle retourne false, donc vérifiez toujours le résultat. Consultez le chapitre dédié strtotime() pour la liste complète des expressions acceptées.
La classe DateTime
Pour tout ce qui va au-delà d'un simple affichage, l'API orientée objet DateTime est l'approche moderne et recommandée. Elle évite les limites de dépassement d'entiers, gère les fuseaux horaires proprement, et rend les calculs de dates lisibles :
<?php
$date = new DateTime("2022-01-01 12:00:00");
// Format it
echo $date->format("l, F j, Y"); // Saturday, January 1, 2022
echo "\n";
// Add or subtract durations with DateInterval
$date->modify("+10 days");
echo $date->format("Y-m-d"); // 2022-01-11
?>DateTimeImmutable fonctionne de la même façon mais ne modifie jamais l'objet d'origine — modify() retourne une nouvelle instance à la place. Préférez-la lorsque vous transmettez des dates, afin qu'une méthode appelée ailleurs ne puisse pas modifier silencieusement votre valeur.
Calculer la différence entre deux dates
DateTime::diff() retourne un DateInterval décrivant l'écart entre deux dates, ce qui est bien plus sûr que de soustraire des timestamps bruts :
<?php
$start = new DateTime("2022-01-01");
$end = new DateTime("2022-03-15");
$diff = $start->diff($end);
echo $diff->days . " days total\n"; // 73 days total
echo $diff->format("%m months, %d days"); // 2 months, 14 days
?>Pour l'équivalent sous forme de fonction, consultez le chapitre date_diff().
Pièges courants
- Le problème de 2038. Sur les systèmes 32 bits,
date()etstrtotime()fonctionnent avec des entiers signés sur 32 bits et échouent à2038-01-19 03:14:07 UTC.DateTimen'est pas affectée, utilisez-la donc pour les dates très éloignées dans le passé ou le futur. date()n'est pasDate(). Les noms de fonctions PHP sont insensibles à la casse, mais les codes de format sont sensibles à la casse :m(mois) etM(nom du mois) sont différents.- Avertissement de fuseau horaire manquant. Sans fuseau horaire configuré, les anciennes versions de PHP émettent un avertissement. Appelez
date_default_timezone_set()tôt. strtotime()retournefalse, pas0, en cas d'échec — et0est un timestamp valide (l'époque Unix), donc testez avec=== false.
Conclusion
PHP vous offre un éventail d'outils pour les dates et les heures. Utilisez date() et time() pour un formatage rapide, strtotime() pour analyser les chaînes entrantes, et les classes DateTime / DateTimeImmutable pour l'arithmétique tenant compte des fuseaux horaires et les comparaisons de dates. Définissez votre fuseau horaire explicitement, validez les entrées analysées, et préférez DateTime chaque fois que vous devez additionner, soustraire ou comparer des dates.
Ensuite, explorez les éléments de base en détail : la fonction date() PHP, strtotime() et les fuseaux horaires PHP.