PHPでdate_sunset()関数を使用して日没時間を計算する場合、開発者はしばしば一見目立たないが重要な問題に遭遇します。誤ったまたは無視されたタイムゾーンの構成により、計算結果が1時間以上異なり、時間の判断(夜間光制御システム、屋外アクティビティリマインダーなど)に基づいてロジックに深刻な影響を与える可能性があります。この記事では、この関数のタイムゾーンの原則を把握し、落とし穴を避けるためにそれを正しく設定する方法を示します。
date_sunset()は、指定された日付、緯度、経度に対応する日没時間を返すPHPの内蔵機能です。基本的な構文は次のとおりです。
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
最も重要なパラメーターは最後のパラメーターです: $ gmt_offset 、つまりGMTの時差。これがタイムゾーンを設定する唯一の方法です。
多くの人は、phpのdate_default_timezone_set()関数を使用してタイムゾーンを設定することに慣れています。
date_default_timezone_set('Asia/Shanghai');
この設定は、 date()やstrtotime()などの関数の出力に影響しますが、 date_sunset()の結果には影響しません。これは、開発者が無視する最も簡単なものです。
// エラーデモンストレーション
date_default_timezone_set('Asia/Shanghai');
echo date_sunset(time(), SUNFUNCS_RET_STRING, 31.2304, 121.4737); // 結果はそうかもしれません GMT 時間
上記のコードは上海のタイムゾーンを設定しますが、返された日没時間はまだGMT時間であり、エラーを引き起こします。
date_sunset()現地時間に一致する結果を返すには、 GMTオフセット値を手動で数時間渡す必要があります。たとえば、中国の標準時間がGMT+8の場合、 $ gmt_offset = 8.0を設定する必要があります。
date_default_timezone_set('Asia/Shanghai'); // このステップは影響しません date_sunset,しかし、それを統一された方法でセットアップすることをお勧めします
// 上海:緯度 31.2304, 経度 121.4737
$sunset = date_sunset(time(), SUNFUNCS_RET_STRING, 31.2304, 121.4737, 90.0, 8.0);
echo "上海的日落時間为:$sunset";
出力例:
上海的日落時間为:18:45
リターンは現地時間であり、もはやGMTではありません。
コードをデッドオフセット値を書き込む代わりに、コードを展開サーバーのタイムゾーンに自動的に適応させたい場合は、これを行うことができます。
$dt = new DateTime('now', new DateTimeZone(date_default_timezone_get()));
$gmtOffset = $dt->getOffset() / 3600; // 数秒で時間をかけます
$sunset = date_sunset(time(), SUNFUNCS_RET_STRING, 31.2304, 121.4737, 90.0, $gmtOffset);
echo "当前时区下的日落時間为:$sunset";
このようにして、たとえコードがさまざまな国のサーバーに展開されていても、正しい日没時間を自動的に計算できます。
ユーザーの都市の日没時間を返すためのインターフェイスを提供したいと仮定します。また、戻り結果は次のとおりです。
{
"city": "上海",
"sunset": "18:45"
}
次のインターフェイスロジックを構築できます(アドレスは均一にM66.netです):
// サンプルインターフェイスアドレス: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" => "上海",
"sunset" => $sunset
]);
date_sunset()は、 PHPのデフォルトタイムゾーンを自動的に使用しません。
$ gmt_offsetパラメーターは、時間内に手動で渡す必要があります。
コードの適応性を高めるために、現在のオフセット値を動的に計算することをお勧めします。
ビジネスロジックエラーを回避するために、GMTの現地時間への変換に注意してください。
太陽の位置に関連する機能を処理する場合、時間の精度はビジネスの精度に等しくなります。 1時間の小さな逸脱がシステムの論理を台無しにしないでください。