La fonction DATE_SUNSET () de PHP est utilisée pour calculer l'heure du coucher du soleil en fonction de la date donnée, de la latitude et de la longitude et d'autres paramètres. Cependant, lors de l'utilisation de cette fonction, de nombreux développeurs constateront que le résultat qu'il renvoie est inexact, même à quelques heures des attentes. Ce problème semble être un bug dans la fonction elle-même, mais en fait, il est lié à la configuration par défaut de PHP, en particulier les paramètres.
La syntaxe de date_sunset () est la suivante:
date_sunset(
int $timestamp,
int $format = SUNFUNCS_RET_STRING,
float $latitude = ini_get("date.default_latitude"),
float $longitude = ini_get("date.default_longitude"),
float $zenith = ini_get("date.sunset_zenith"),
float $gmt_offset = 0
): string|int|float|false
Cette fonction prend un horodatage (généralement le résultat de strToTime () ) et une série de paramètres géographiques, puis renvoie le temps de coucher du soleil. La clé réside dans le dernier paramètre: $ gmt_offset , c'est-à-dire le décalage GMT.
Si vous ne fournissez pas $ gmt_offset , PHP essaiera de calculer le décalage à l'aide de la configuration du fuseau horaire actuel (c'est-à-dire Date.TimeZone ). Si le fuseau horaire est défini de manière incorrecte ou non, les résultats du calcul s'écarteront de la valeur réelle.
Pour des raisons de compatibilité, de nombreux serveurs peuvent ne pas être définis dans le fuseau horaire par défaut de PHP, ou il peut être défini sur UTC . Cela signifie:
L'heure du coucher du soleil sera retournée en tant que temps UTC, pas l'heure locale;
Si vous sortez ou formatez cette fois directement en tant que chaîne, il sera incompatible avec le vrai temps de coucher de soleil dans votre région.
Par exemple:
echo date_sunset(strtotime('2025-04-26'), SUNFUNCS_RET_STRING, 31.2304, 121.4737); // Coordonnées de Shanghai
Dans le fuseau horaire UTC par défaut, le retour peut être "09:54", mais ce que vous attendez, c'est le soir.
La méthode la plus recommandée consiste à définir explicitement le fuseau horaire requis dans le script. Par exemple:
date_default_timezone_set('Asia/Shanghai');
Cela affecte toutes les fonctions de temps, y compris date_sunset () . Lorsqu'il est utilisé conjointement avec les coordonnées de Shanghai, le temps de retour sera le huitième district de l'est.
Si vous ne souhaitez pas modifier les paramètres du fuseau horaire global, vous pouvez également spécifier manuellement le décalage du fuseau horaire en transmettant le paramètre $ GMT_OFFSET . Par exemple:
echo date_sunset(strtotime('2025-04-26'), SUNFUNCS_RET_STRING, 31.2304, 121.4737, 90.83, 8);
Le dernier paramètre 8 représente ici le huitième district est (GMT + 8).
Du niveau du serveur, vous pouvez modifier le fichier de configuration PHP (php.ini):
date.timezone = "Asia/Shanghai"
N'oubliez pas de redémarrer le serveur Web (comme Nginx ou Apache) après modification.
Pour les applications, il est le plus sûr de toujours définir explicitement le fuseau horaire ;
Pour les projets Framework, assurez-vous que le fuseau horaire par défaut est défini dans l'initialisation de Framework;
Pour les systèmes déployés à plusieurs endroits, envisagez d'ajuster dynamiquement $ gmt_offset en fonction de l'emplacement de l'utilisateur.
Le comportement de la fonction date_sunset () dépend de la configuration du fuseau horaire actuel, et si vous ne définissez pas correctement Date.TimeZone ou $ gmt_offset , l'heure du coucher du soleil que vous obtenez peut être complètement inexacte. Comprendre comment PHP gère les fuseaux horaires et les définir raisonnablement au besoin est la clé pour utiliser ce type de fonction temporelle.
Pendant le développement et le déploiement, n'oubliez pas de vérifier votre configuration PHP pour éviter de confondre les erreurs de temps.