date()
Les fonctions de date et d'heure sont essentielles en PHP. Découvrez date(), time(), strtotime() et la classe DateTime avec des exemples concrets.
Introduction
Presque toutes les applications ont tôt ou tard besoin d'afficher, stocker ou comparer une date : une ligne « publié le », un compte à rebours, une vérification d'expiration. Ce chapitre explique comment fonctionnent les outils de date et d'heure de PHP et quand utiliser chacun d'eux. Nous commençons par les fonctions du quotidien — date(), time() et strtotime() — puis nous passons à la manipulation et à la comparaison des dates, pour terminer par les points qui posent le plus souvent problème : les fuseaux horaires et l'heure d'été.
Travailler avec les dates en PHP
PHP propose deux ensembles d'outils complémentaires pour les dates :
- Les fonctions procédurales —
date(),time(),mktime()etstrtotime()— qui travaillent avec un horodatage Unix (un entier simple : le nombre de secondes écoulées depuis le 1er janvier 1970 UTC). Elles sont pratiques pour un formatage rapide et de l'arithmétique simple. - L'API orientée objet
DateTime— les classesDateTime,DateIntervaletDateTimeZone— qui est plus lisible pour tout ce qui implique des intervalles, des comparaisons ou des fuseaux horaires, et qui constitue l'approche recommandée pour les nouveaux projets.
Ce chapitre utilise les deux styles afin que vous puissiez reconnaître chacun d'eux dans des bases de code réelles.
La fonction date()
La fonction date() transforme un horodatage en chaîne formatée. Elle prend une chaîne de format comme premier paramètre et un horodatage optionnel comme second ; lorsque l'horodatage est omis, date() utilise l'heure actuelle.
Ceci affiche la date actuelle au format « Mois Jour, Année », par exemple March 3, 2023.
Chaque lettre de la chaîne de format est un espace réservé. Le tableau ci-dessous liste les caractères les plus couramment utilisés :
| Caractère | Signification | Exemple |
|---|---|---|
Y | Année sur 4 chiffres | 2023 |
y | Année sur 2 chiffres | 23 |
m | Mois, 2 chiffres (01–12) | 03 |
n | Mois, sans zéro initial | 3 |
F | Nom complet du mois | March |
M | Nom abrégé du mois | Mar |
d | Jour du mois, 2 chiffres | 03 |
j | Jour du mois, sans zéro initial | 3 |
l | Nom complet du jour | Friday |
H | Heure, format 24h, 2 chiffres | 14 |
h | Heure, format 12h, 2 chiffres | 02 |
i | Minutes, 2 chiffres | 09 |
s | Secondes, 2 chiffres | 05 |
A | AM / PM | PM |
Tout caractère non reconnu comme espace réservé est affiché littéralement, donc date("Y-m-d H:i:s") produit une valeur comme 2023-03-03 14:09:05. Pour afficher une lettre littérale qui serait autrement interprétée comme un espace réservé, échappez-la avec un antislash : date('l \t\h\e jS'). Pour la liste complète des espaces réservés, consultez le chapitre date-format().
La fonction time()
La fonction time() retourne l'horodatage Unix actuel — le nombre de secondes écoulées depuis le 1er janvier 1970 UTC. Elle ne prend aucun argument et constitue le point de départ habituel pour l'arithmétique de dates, car les entiers sont faciles à additionner et à comparer.
Ceci affiche l'horodatage Unix actuel, un grand entier comme 1646369616. Combinez-le avec date() pour formater « maintenant » : date("Y-m-d", time()). Consultez le chapitre time() pour plus de détails.
La fonction strtotime()
La fonction strtotime() analyse une date textuelle en anglais — "March 3, 2023", "next Monday", "+2 weeks" — et retourne l'horodatage Unix correspondant. Elle est remarquablement flexible, ce qui la rend pratique pour transformer une saisie humaine en horodatage que l'on peut formater ou comparer.
Ceci affiche l'horodatage Unix pour le 3 mars 2023 : 1677801600.
Attention : si
strtotime()ne peut pas analyser la chaîne, elle retournefalse, et non une erreur. Vérifiez toujours le résultat avant de l'utiliser —if (($ts = strtotime($input)) === false) { /* date invalide */ }— sinonfalseest silencieusement converti en0, ce qui donne le 1er janvier 1970. Consultez le chapitre strtotime() pour la grammaire complète qu'elle accepte.
Manipuler les dates en PHP
En plus du formatage des dates, PHP propose également diverses fonctions pour manipuler les dates. Ces fonctions vous permettent d'ajouter ou de soustraire du temps à une date, de comparer des dates, et bien plus encore.
Ajouter et soustraire du temps avec strtotime()
strtotime() fait bien plus qu'analyser des dates fixes — elle comprend aussi les expressions relatives. Passez un horodatage de base comme second argument et une expression comme "+1 day", "-3 weeks" ou "first day of next month" comme premier, et vous obtenez un nouvel horodatage.
Ceci affichera la date un jour après le 3 mars 2023, soit « March 4, 2023 ».
Les méthodes DateTime::add() et DateTime::sub()
Les méthodes orientées objet DateTime::add() et DateTime::sub() ajoutent ou soustraient un DateInterval d'un objet DateTime. Un DateInterval est construit à partir d'une chaîne de durée ISO 8601 : P1D signifie « une période d'1 jour », P2W correspond à deux semaines, et PT1H30M à une heure et trente minutes (le T sépare la partie date de la partie heure).
Ce style est préféré pour les nouveaux projets car l'opération se lit comme une phrase et l'objet garde trace de son propre fuseau horaire.
Ceci affiche la date un jour après le 3 mars 2023 : March 4, 2023. Les chapitres dédiés date-add() et date-sub() approfondissent le sujet, et date-diff() montre comment obtenir l'intervalle entre deux objets DateTime.
Comparer des dates en PHP
Puisque les horodatages sont de simples entiers, vous pouvez comparer deux dates avec les opérateurs ordinaires <, > et == une fois que les deux membres sont des horodatages. Convertissez chaque chaîne de date avec strtotime() au préalable.
Ceci affiche Date 1 is earlier than Date 2. Pour comparer des objets DateTime, vous pouvez utiliser les mêmes opérateurs directement ($a < $b) sans conversion en horodatages.
Fuseaux horaires et heure d'été
La partie la plus délicate du travail avec les dates est de s'assurer qu'elles font référence au même moment selon les régions. date() et time() interprètent les horodatages selon le fuseau horaire par défaut configuré en PHP, il est donc important de bien paramétrer ce réglage.
La fonction date_default_timezone_set()
date_default_timezone_set() définit le fuseau horaire par défaut utilisé par toutes les fonctions de date et d'heure pour le reste de la requête. Appelez-la une fois, tôt dans votre script, en passant un identifiant IANA valide tel que America/New_York ou Europe/London.
<?php
date_default_timezone_set("America/New_York");
echo date("Y-m-d H:i:s");
?>Une liste des identifiants valides se trouve dans le chapitre php-timezones ; la lecture du réglage actuel est couverte par date-default-timezone-get().
La classe DateTimeZone
Lorsque vous avez besoin de différents fuseaux horaires dans le même script — par exemple, pour afficher l'heure d'un événement à des utilisateurs de plusieurs régions — définir le fuseau par défaut une seule fois ne suffit pas. La classe DateTimeZone permet à un objet DateTime spécifique de porter son propre fuseau :
<?php
$timezone = new DateTimeZone("America/New_York");
$date = new DateTime("2023-03-03 09:00", $timezone);
echo $date->format("Y-m-d H:i T");
?>Ceci formate la date à l'heure de New York et affiche l'abréviation du fuseau horaire (T), par exemple 2023-03-03 09:00 EST.
Travailler avec l'heure d'été
L'heure d'été (DST) avance ou recule l'horloge, de sorte que le décalage pour un fuseau comme America/New_York n'est pas fixe (EST vs EDT). PHP gère le changement automatiquement tant que vous utilisez un fuseau nommé plutôt qu'un décalage codé en dur. Le caractère de format I (i majuscule) de date() indique si l'heure d'été est actuellement en vigueur : 1 si oui, 0 sinon.
Ceci indique si l'heure d'été est ou non en vigueur pour le fuseau horaire par défaut actuel.
Conclusion
Vous disposez maintenant des outils essentiels pour travailler avec les dates en PHP : date() pour formater, time() et strtotime() pour obtenir et analyser des horodatages, la famille DateTime pour ajouter, soustraire et comparer, et DateTimeZone pour gérer différentes régions. En règle générale, préférez les fonctions procédurales pour un formatage ponctuel rapide et l'API orientée objet DateTime pour tout ce qui implique des intervalles, des comparaisons ou plusieurs fuseaux horaires. Pour une présentation plus complète, consultez PHP Date and Time.