Bei der Berechnung der Sonnenuntergangszeit unter Verwendung der Funktion date_sunset () in PHP stoßen Entwickler häufig auf ein scheinbar unauffälliges, aber wichtiges Problem :. Falsche oder ignorierte Zeitzonenkonfigurationen können dazu führen, dass die Berechnungsergebnisse um eine Stunde oder sogar mehr unterschiedlich sind und die Logik aufgrund des Zeiturteils (z. B. Nachtlichtkontrollsysteme, Aktivitäten im Freien usw.) ernsthaft beeinflussen. In diesem Artikel werden Sie zum Zeitpunkt der Zeitzone dieser Funktion herausgefunden und zeigen, wie Sie es richtig festlegen, um Fallstricke zu vermeiden.
DATE_SUNSET () ist eine integrierte Funktion in PHP, die die Sonnenuntergangszeit zurückgibt, die dem angegebenen Datum, Breitengrad und Längengrad entspricht. Die grundlegende Syntax ist wie folgt:
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
Der kritischste Parameter ist der letzte: $ GMT_OFFSET , dh der Zeitunterschied mit GMT . Dies ist der einzige Weg, um die Zeitzone festzulegen.
Viele Personen werden es gewohnt, die Funktion von PHP zu verwenden, um die Zeitzone festzulegen, beispielsweise:
date_default_timezone_set('Asia/Shanghai');
Obwohl diese Einstellung die Ausgabe von Funktionen wie Datum () und Strtotime () beeinflusst, wirkt sich dies nicht auf das Ergebnis von DATE_SUNSET () aus! Dies ist das einfachste, was Entwickler ignorieren.
// Fehlerdemonstration
date_default_timezone_set('Asia/Shanghai');
echo date_sunset(time(), SUNFUNCS_RET_STRING, 31.2304, 121.4737); // Das Ergebnis kann sein GMT Zeit
Obwohl der obige Code die Zeitzone Shanghai festlegt, ist die zurückgegebene Sonnenuntergangszeit immer noch die GMT -Zeit, was zu Fehlern führt.
Um Date_sunset () zurückzugeben, geben Sie ein Ergebnis zurück, das der lokalen Zeit entspricht, der GMT -Offset -Wert muss manuell in Stunden übergeben werden . Wenn die chinesische Standardzeit beispielsweise GMT+8 beträgt, müssen Sie $ gmt_offset = 8.0 festlegen.
date_default_timezone_set('Asia/Shanghai'); // Dieser Schritt wird sich nicht auswirken date_sunset,Es wird jedoch immer noch empfohlen, es auf einheitliche Weise einzurichten
// Shanghai:Breite 31.2304, Länge 121.4737
$sunset = date_sunset(time(), SUNFUNCS_RET_STRING, 31.2304, 121.4737, 90.0, 8.0);
echo "Shanghai的日落Zeit为:$sunset";
Ausgangsbeispiel:
Shanghai的日落Zeit为:18:45
Die Rückkehr ist die lokale Zeit, nicht mehr GMT.
Wenn Sie möchten, dass der Code automatisch an die Zeitzone des Bereitstellungsservers anpasst, anstatt tote Offset -Werte zu schreiben, können Sie dies tun:
$dt = new DateTime('now', new DateTimeZone(date_default_timezone_get()));
$gmtOffset = $dt->getOffset() / 3600; // Stunden in Sekunden abbiegen
$sunset = date_sunset(time(), SUNFUNCS_RET_STRING, 31.2304, 121.4737, 90.0, $gmtOffset);
echo "当前时区下的日落Zeit为:$sunset";
Auf diese Weise kann die richtige Sonnenuntergangszeit automatisch berechnet werden, selbst wenn der Code in Servern in verschiedenen Ländern bereitgestellt wird.
Nehmen wir an, Sie möchten eine Schnittstelle zur Verfügung stellen, um die Sonnenuntergangszeit der Stadt des Benutzers zurückzugeben, und das Rückgabeergebnis kann wie folgt sein:
{
"city": "Shanghai",
"sunset": "18:45"
}
Sie können die folgende Schnittstellenlogik erstellen (die Adresse ist einheitlich m66.net ):
// Beispiel -Schnittstellenadresse: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 () verwendet die Standardzeitzone von PHP nicht automatisch.
Der Parameter $ GMT_OFFSET muss in Stunden manuell übergeben werden.
Es wird empfohlen, den aktuellen Offset -Wert dynamisch zu berechnen, um die Code -Anpassungsfähigkeit zu verbessern.
Achten Sie auf die Konvertierung von GMT in die lokale Zeit, um Geschäftslogikfehler zu vermeiden.
Bei der Verarbeitungsfunktionen im Zusammenhang mit der Position der Sonne entspricht die Zeitgenauigkeit der Geschäftsgenauigkeit . Lassen Sie eine Stunde kleiner Abweichung nicht Ihre Systemlogik ruinieren.