date_default_timezone_set()
Apprenez à utiliser date_default_timezone_set() en PHP pour contrôler le fuseau horaire de toutes les fonctions date/heure d'un script, avec exemples.
Introduction
La fonction date_default_timezone_set() définit le fuseau horaire par défaut utilisé par toutes les fonctions date/heure d'un script PHP. Une fois appelée, des fonctions comme date(), mktime(), strtotime() et DateTime interprètent et formatent les heures par rapport à ce fuseau horaire. Cette page explique ce que fait la fonction, quand vous en avez besoin, et les pièges à éviter.
Syntaxe
date_default_timezone_set(string $timezoneId): bool$timezoneId est une string identifiant de fuseau horaire issue de la base de données IANA, comme Europe/London ou Asia/Tokyo — pas une abréviation telle que EST. La fonction retourne true en cas de succès et false si l'identifiant est invalide. Lorsque l'identifiant est invalide, PHP émet également un E_WARNING et revient au fuseau horaire précédemment configuré.
Pourquoi c'est important
Un timestamp est simplement un nombre de secondes depuis l'époque Unix (UTC). Pour transformer ce nombre en date lisible — "2024-03-15 14:30" — PHP doit savoir dans quel fuseau horaire l'afficher. Si vous n'en définissez pas, PHP utilise la valeur date.timezone de php.ini, qui peut différer entre votre machine locale, l'environnement de staging et la production. Ce décalage est une source classique de bugs du type "l'heure est fausse de quelques heures".
Appeler date_default_timezone_set() tôt dans votre script rend le fuseau horaire explicite et cohérent partout où votre code s'exécute, quelle que soit la configuration du serveur.
Utilisation de base
<?php
date_default_timezone_set('America/New_York');
echo date('Y-m-d H:i:s');Ceci définit le fuseau horaire du script sur l'heure de l'Est des États-Unis. Chaque appel date/heure suivant sera rendu dans ce fuseau. Définir le fuseau ne modifie pas le timestamp sous-jacent — uniquement la façon dont il est affiché.
Changer de fuseau horaire à l'exécution
Vous pouvez changer le fuseau horaire par défaut plusieurs fois. Le même timestamp Unix affiche une heure murale différente selon chaque fuseau :
Ici, date_default_timezone_get() confirme le fuseau actuellement actif — utile lors du débogage.
Gérer un identifiant invalide
Puisque la fonction retourne false (et émet un avertissement) en cas d'identifiant invalide, validez la valeur de retour lorsque le fuseau provient d'une entrée utilisateur ou d'une configuration :
<?php
$zone = 'Mars/Olympus_Mons'; // not a real timezone
if (@date_default_timezone_set($zone)) {
echo "Timezone set to $zone\n";
} else {
date_default_timezone_set('UTC');
echo "Invalid timezone, falling back to UTC\n";
}
// Outputs: Invalid timezone, falling back to UTCIdentifiants couramment utilisés
PHP prend en charge des centaines de fuseaux. Quelques-uns fréquemment utilisés :
| Région | Identifiant |
|---|---|
| New York | America/New_York |
| Chicago | America/Chicago |
| Los Angeles | America/Los_Angeles |
| Londres | Europe/London |
| Paris | Europe/Paris |
| Tokyo | Asia/Tokyo |
| Sydney | Australia/Sydney |
| Temps universel coordonné | UTC |
Pour la liste complète générée automatiquement, utilisez timezone_identifiers_list(), et consultez la référence PHP timezones pour un aperçu.
Bonnes pratiques
- Définissez-le une seule fois, tôt. Appelez la fonction près du début de votre fichier d'amorçage/d'entrée afin que toute la requête partage un seul fuseau.
- Préférez stocker en UTC. Enregistrez les timestamps en UTC dans la base de données et convertissez vers le fuseau de l'utilisateur uniquement pour l'affichage ; cela évite toute ambiguïté liée à l'heure d'été.
- Utilisez des identifiants, pas des abréviations.
Europe/Londongère automatiquement l'heure d'été ;GMT/BSTne le font pas.
Conclusion
date_default_timezone_set() vous donne un contrôle explicite sur la façon dont PHP affiche les dates et les heures, en maintenant un comportement cohérent entre les environnements. Définissez-le délibérément, validez les identifiants non fiables, et confirmez le fuseau actif avec date_default_timezone_get() lorsque quelque chose semble incorrect.