現在の位置: ホーム> 最新記事一覧> date_sunset()を使用する場合の一般的な誤解

date_sunset()を使用する場合の一般的な誤解

M66 2025-05-31

PHPでdate_sunset()関数を使用して日没時間を計算する場合、開発者はしばしば一見目立たないが重要な問題に遭遇します。誤ったまたは無視されたタイムゾーンの構成により、計算結果が1時間以上異なり、時間の判断(夜間光制御システム、屋外アクティビティリマインダーなど)に基づいてロジックに深刻な影響を与える可能性があります。この記事では、この関数のタイムゾーンの原則を把握し、落とし穴を避けるためにそれを正しく設定する方法を示します。

1。date_sunset ()関数の紹介

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の時差。これがタイムゾーンを設定する唯一の方法です。

2。タイムゾーン設定における一般的な誤解

多くの人は、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時間であり、エラーを引き起こします。

3.タイムゾーンを正しく設定する方法

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ではありません。

4.現在のタイムゾーンオフセット(推奨)を動的に取得する

コードをデッドオフセット値を書き込む代わりに、コードを展開サーバーのタイムゾーンに自動的に適応させたい場合は、これを行うことができます。

 $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";

このようにして、たとえコードがさまざまな国のサーバーに展開されていても、正しい日没時間を自動的に計算できます。

5。実用的なアプリケーションシナリオと組み合わせて:APIインターフェイスの例

ユーザーの都市の日没時間を返すためのインターフェイスを提供したいと仮定します。また、戻り結果は次のとおりです。

 {
    "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
]);

6。概要

  • date_sunset()は、 PHPのデフォルトタイムゾーンを自動的に使用しません。

  • $ gmt_offsetパラメーターは、時間内に手動で渡す必要があります。

  • コードの適応性を高めるために、現在のオフセット値を動的に計算することをお勧めします。

  • ビジネスロジックエラーを回避するために、GMTの現地時間への変換に注意してください。

太陽の位置に関連する機能を処理する場合、時間の精度はビジネスの精度に等しくなります。 1時間の小さな逸脱がシステムの論理を台無しにしないでください。