[PHP]日没時刻を計算:date_sunset関数の完全ガイド!

PHP

こんにちは!今回は、PHPのdate_sunset関数について詳しく解説していきます。日の入り時刻を計算するのに便利な関数です!

1. date_sunset関数の基本情報

構文

date_sunset(
    int $timestamp,
    int $format = SUNFUNCS_RET_STRING,
    float $latitude = null,
    float $longitude = null,
    float $zenith = null,
    float $gmt_offset = null
): mixed

パラメータの説明

  1. timestamp
  • 日没時刻を計算したい日のUNIXタイムスタンプ
  1. format(戻り値の形式)
   SUNFUNCS_RET_STRING    // "HH:MM" 形式
   SUNFUNCS_RET_DOUBLE    // 浮動小数点数
   SUNFUNCS_RET_TIMESTAMP // UNIXタイムスタンプ
  1. latitude(緯度)
  • -90.0から90.0の値
  • 北緯は正の値、南緯は負の値
  1. longitude(経度)
  • -180.0から180.0の値
  • 東経は正の値、西経は負の値
  1. zenith(天頂角)
  • 標準値: 90°50′
  1. gmt_offset
  • GMTとの時差(日本は9)

2. 実践的な使用例

基本的な使用例

<?php
// 東京の今日の日没時刻
$tokyo_sunset = date_sunset(
    time(),
    SUNFUNCS_RET_STRING,
    35.6895,  // 東京の緯度
    139.6917, // 東京の経度
    90.583333,
    9
);
echo "東京の今日の日没時刻: " . $tokyo_sunset;

日の出と日没の両方を取得する関数

<?php
function getDaylightHours($date, $latitude, $longitude) {
    $timestamp = strtotime($date);

    $sunrise = date_sunrise(
        $timestamp,
        SUNFUNCS_RET_STRING,
        $latitude,
        $longitude,
        90.583333,
        9
    );

    $sunset = date_sunset(
        $timestamp,
        SUNFUNCS_RET_STRING,
        $latitude,
        $longitude,
        90.583333,
        9
    );

    return [
        'date' => $date,
        'sunrise' => $sunrise,
        'sunset' => $sunset,
        'daylight_hours' => strtotime($sunset) - strtotime($sunrise)
    ];
}

// 使用例
$tokyo_daylight = getDaylightHours(
    '2024-01-01',
    35.6895,
    139.6917
);

月間の日没時刻を取得

<?php
function getMonthlySunset($year, $month, $latitude, $longitude) {
    $sunset_data = [];

    $days_in_month = cal_days_in_month(CAL_GREGORIAN, $month, $year);

    for ($day = 1; $day <= $days_in_month; $day++) {
        $date = sprintf('%04d-%02d-%02d', $year, $month, $day);
        $timestamp = strtotime($date);

        $sunset = date_sunset(
            $timestamp,
            SUNFUNCS_RET_STRING,
            $latitude,
            $longitude,
            90.583333,
            9
        );

        $sunset_data[$date] = $sunset;
    }

    return $sunset_data;
}

3. 便利な活用例

日照時間の計算

<?php
function calculateDaylightHours($date, $latitude, $longitude) {
    $timestamp = strtotime($date);

    $sunrise = date_sunrise(
        $timestamp,
        SUNFUNCS_RET_TIMESTAMP,
        $latitude,
        $longitude,
        90.583333,
        9
    );

    $sunset = date_sunset(
        $timestamp,
        SUNFUNCS_RET_TIMESTAMP,
        $latitude,
        $longitude,
        90.583333,
        9
    );

    $daylight_seconds = $sunset - $sunrise;
    $daylight_hours = $daylight_seconds / 3600;

    return [
        'hours' => floor($daylight_hours),
        'minutes' => floor(($daylight_hours - floor($daylight_hours)) * 60)
    ];
}

主要都市の日没時刻比較

<?php
$cities = [
    '東京' => ['lat' => 35.6895, 'lng' => 139.6917],
    '大阪' => ['lat' => 34.6937, 'lng' => 135.5022],
    '札幌' => ['lat' => 43.0621, 'lng' => 141.3544],
    '那覇' => ['lat' => 26.2124, 'lng' => 127.6809]
];

function compareCitySunsets($date, $cities) {
    $results = [];

    foreach ($cities as $city => $coords) {
        $sunset = date_sunset(
            strtotime($date),
            SUNFUNCS_RET_STRING,
            $coords['lat'],
            $coords['lng'],
            90.583333,
            9
        );

        $results[$city] = $sunset;
    }

    return $results;
}

4. 注意点とTips

  1. 精度について
  • 計算結果は気象条件を考慮しない理論値です
  • 実際の日没時刻とは多少のずれが生じる可能性があります
  1. エラー処理
<?php
function getSafeySunset($date, $latitude, $longitude) {
    try {
        $timestamp = strtotime($date);
        if ($timestamp === false) {
            throw new Exception('Invalid date format');
        }

        $sunset = date_sunset(
            $timestamp,
            SUNFUNCS_RET_STRING,
            $latitude,
            $longitude,
            90.583333,
            9
        );

        if ($sunset === false) {
            throw new Exception('Failed to calculate sunset time');
        }

        return $sunset;
    } catch (Exception $e) {
        error_log($e->getMessage());
        return null;
    }
}

まとめ

date_sunset関数は、日没時刻の計算に非常に便利な関数です。天文写真の撮影計画や、屋外イベントの終了時間の設定など、様々な用途で活用できます。

特に日の出時刻(date_sunrise)と組み合わせることで、より実用的な機能を実装することができます。

ぜひ、これらの例を参考に、みなさんのプロジェクトでも活用してみてください!

タイトルとURLをコピーしました