Lors du calcul de l'heure du coucher du soleil à l'aide de la fonction date_sunset () en PHP, les développeurs rencontrent souvent un problème apparemment discret mais crucial :. Des configurations de fuseau horaire incorrectes ou ignorées peuvent faire en sorte que les résultats du calcul soient différents d'une heure ou plus, affectant sérieusement la logique en fonction du jugement temporel (comme les systèmes de contrôle de la lumière de nuit, les rappels d'activité en plein air, etc.). Cet article vous emmènera pour déterminer le principe du fuseau horaire de cette fonction et montrer comment le définir correctement pour éviter les pièges.
Date_sunset () est une fonction intégrée en PHP qui renvoie l'heure du coucher du soleil correspondant à la date, la latitude et la longitude spécifiées. La syntaxe de base 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
Le paramètre le plus critique est le dernier: $ gmt_offset , c'est-à-dire le décalage horaire avec GMT . C'est le seul moyen de définir le fuseau horaire.
Beaucoup de gens ont l'habitude d'utiliser la fonction DATE_DEFAULT_TIMEZONE_SET () de PHP pour définir le fuseau horaire, par exemple:
date_default_timezone_set('Asia/Shanghai');
Bien que ce paramètre affecte la sortie des fonctions telles que Date () et StrtoTime () , elle n'affectera pas le résultat de Date_sunset () ! C'est la chose la plus simple que les développeurs ignorent.
// Démonstration d'erreur
date_default_timezone_set('Asia/Shanghai');
echo date_sunset(time(), SUNFUNCS_RET_STRING, 31.2304, 121.4737); // Le résultat peut être GMT temps
Bien que le code ci-dessus définisse le fuseau horaire de Shanghai, le temps de coucher du soleil renvoyé est toujours le temps GMT, ce qui provoque des erreurs.
Pour faire date_sunset () renvoie un résultat qui correspond à l'heure locale, la valeur de décalage GMT doit être transmise manuellement en heures. Par exemple, si l'heure standard chinoise est GMT + 8, vous devez définir $ gmt_offset = 8.0 .
date_default_timezone_set('Asia/Shanghai'); // Cette étape n'affectera pas date_sunset,Mais il est toujours recommandé de le configurer de manière unifiée
// Shanghai:latitude 31.2304, longitude 121.4737
$sunset = date_sunset(time(), SUNFUNCS_RET_STRING, 31.2304, 121.4737, 90.0, 8.0);
echo "Shanghai的日落temps为:$sunset";
Exemple de sortie:
Shanghai的日落temps为:18:45
Le retour est l'heure locale, plus GMT.
Si vous souhaitez que le code s'adapte automatiquement au fuseau horaire du serveur de déploiement au lieu d'écrire des valeurs de décalage mort, vous pouvez le faire:
$dt = new DateTime('now', new DateTimeZone(date_default_timezone_get()));
$gmtOffset = $dt->getOffset() / 3600; // Tourner les heures en quelques secondes
$sunset = date_sunset(time(), SUNFUNCS_RET_STRING, 31.2304, 121.4737, 90.0, $gmtOffset);
echo "当前时区下的日落temps为:$sunset";
De cette façon, même si le code est déployé dans des serveurs dans différents pays, le temps de coucher du soleil peut être calculé automatiquement.
Supposons que vous souhaitiez fournir une interface pour retourner l'heure du coucher du soleil de la ville de l'utilisateur, et le résultat de retour peut être le suivant:
{
"city": "Shanghai",
"sunset": "18:45"
}
Vous pouvez créer la logique d'interface suivante (l'adresse est uniformément m66.net ):
// Exemple d'adresse d'interface:https://api.m66.net/sunset.php?lat=31.2304&lng=121.4737
$lat = $_GET['lat'] ?? 31.2304;
$lng = $_GET['lng'] ?? 121.4737;
$dt = new DateTime('now', new DateTimeZone(date_default_timezone_get()));
$gmtOffset = $dt->getOffset() / 3600;
$sunset = date_sunset(time(), SUNFUNCS_RET_STRING, $lat, $lng, 90.0, $gmtOffset);
echo json_encode([
"city" => "Shanghai",
"sunset" => $sunset
]);
DATE_SUNSET () n'utilise pas automatiquement le fuseau horaire par défaut de PHP.
Le paramètre $ gmt_offset doit être transmis manuellement, en heures.
Il est recommandé de calculer dynamiquement la valeur de décalage actuelle pour améliorer l'adaptabilité du code.
Faites attention à la conversion de GMT en temps local pour éviter les erreurs de logique commerciale.
Lors du traitement des fonctions liées à la position du Soleil, la précision du temps est égale à la précision de l'entreprise . Ne laissez pas une heure de petite déviation ruiner votre logique système.