PHPのdate_sunset()関数は、指定された日付、緯度、経度、およびその他のパラメーターに基づいて日没時間を計算するために使用されます。ただし、この機能を使用すると、多くの開発者は、それが返す結果が不正確であり、期待から数時間以外でも不正確であることがわかります。この問題は、関数自体のバグのようですが、実際にはPHPのデフォルト構成、特に設定に関連しています。
date_sunset()の構文は次のとおりです。
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
この関数は、タイムスタンプ(通常はstrtotime()の結果)と一連の地理的パラメーターを取り、日没時間を返します。キーは、最後のパラメーターにあります: $ gmt_offset 、つまりGMTオフセット。
$ gmt_offsetを提供しない場合、PHPは現在のタイムゾーン構成(つまりdate.timezone )を使用してオフセットを計算しようとします。タイムゾーンが誤って設定されているかどうかにかかわらず、計算結果は実際の値から逸脱します。
互換性の理由により、多くのサーバーがPHPのデフォルトタイムゾーンに設定されていないか、 UTCに設定される場合があります。これはつまり:
日没時間は、現地時間ではなくUTC時間として返されます。
今回、今回はストリングとして直接出力またはフォーマットする場合、お住まいの地域の実際の日没時間と矛盾します。
例えば:
echo date_sunset(strtotime('2025-04-26'), SUNFUNCS_RET_STRING, 31.2304, 121.4737); // 上海座標
デフォルトのUTCタイムゾーンでは、リターンは「09:54」かもしれませんが、期待するのは夕方です。
最も推奨される方法は、スクリプトに必要なタイムゾーンを明示的に設定することです。例えば:
date_default_timezone_set('Asia/Shanghai');
これは、 date_sunset()を含むすべての時間関数に影響します。上海座標と組み合わせて使用する場合、返品時間は東8番目の地区時間になります。
グローバルタイムゾーンの設定を変更したくない場合は、 $ GMT_OFFSESTパラメーターを渡すことで、タイムゾーンオフセットを手動で指定することもできます。例えば:
echo date_sunset(strtotime('2025-04-26'), SUNFUNCS_RET_STRING, 31.2304, 121.4737, 90.83, 8);
ここの最後のパラメーター8は、東第8地区(GMT+8)を表しています。
サーバーレベルから、PHP構成ファイル(PHP.ini)を変更できます。
date.timezone = "Asia/Shanghai"
変更後にWebサーバー(NginxやApacheなど)を再起動することを忘れないでください。
アプリケーションの場合、常に明示的にタイムゾーンを設定することが最も安全です。
フレームワークプロジェクトの場合、デフォルトのタイムゾーンがフレームワークの初期化に設定されていることを確認してください。
複数の場所に展開されているシステムの場合は、ユーザーの場所に応じて$ GMT_OFFSETを動的に調整することを検討してください。
date_sunset()関数の動作は、現在のタイムゾーンの構成に依存します。日付を設定しない場合、timezoneまたは$ gmt_offsetを正しく正しく設定してください。 PHPがタイムゾーンを処理する方法を理解し、必要に応じて合理的に設定することは、そのような時間関数を使用するための鍵です。
開発と展開中は、時間エラーを混乱させないようにPHP構成を確認してください。