[PHP]天文計算:date_sun_info()関数完全解説!太陽の情報を取得しよう

PHP

こんにちは!今回は、PHPの日付関数の中でもユニークなdate_sun_info()関数について詳しく解説していきます。

🌅 date_sun_info()とは?

date_sun_info()は、指定された日付と場所(緯度・経度)における太陽の情報(日の出、日の入り、薄明など)を取得する関数です。

🔰 基本的な使用法

$timestamp = strtotime('2024-01-15');
$latitude = 35.6762; // 東京の緯度
$longitude = 139.6503; // 東京の経度

$sun_info = date_sun_info($timestamp, $latitude, $longitude);

💡 返り値の内容

array(
    'sunrise'                => タイムスタンプ, // 日の出時刻
    'sunset'                 => タイムスタンプ, // 日の入り時刻
    'transit'               => タイムスタンプ, // 南中時刻
    'civil_twilight_begin'   => タイムスタンプ, // 市民薄明開始時刻
    'civil_twilight_end'     => タイムスタンプ, // 市民薄明終了時刻
    'nautical_twilight_begin'=> タイムスタンプ, // 航海薄明開始時刻
    'nautical_twilight_end'  => タイムスタンプ, // 航海薄明終了時刻
    'astronomical_twilight_begin' => タイムスタンプ, // 天文薄明開始時刻
    'astronomical_twilight_end'   => タイムスタンプ  // 天文薄明終了時刻
)

🎯 実践的な使用例

1. 基本的な太陽情報の取得

function getSunInfo($date, $latitude, $longitude) {
    $timestamp = strtotime($date);
    $sun_info = date_sun_info($timestamp, $latitude, $longitude);

    return [
        '日の出' => date('H:i', $sun_info['sunrise']),
        '日の入り' => date('H:i', $sun_info['sunset']),
        '南中時刻' => date('H:i', $sun_info['transit']),
        '日中時間' => ($sun_info['sunset'] - $sun_info['sunrise']) / 3600 . '時間'
    ];
}

// 使用例
$tokyo = getSunInfo('2024-01-15', 35.6762, 139.6503);

2. 薄明時間の計算

function getTwilightInfo($date, $latitude, $longitude) {
    $info = date_sun_info(strtotime($date), $latitude, $longitude);

    return [
        '市民薄明' => [
            '開始' => date('H:i', $info['civil_twilight_begin']),
            '終了' => date('H:i', $info['civil_twilight_end'])
        ],
        '航海薄明' => [
            '開始' => date('H:i', $info['nautical_twilight_begin']),
            '終了' => date('H:i', $info['nautical_twilight_end'])
        ],
        '天文薄明' => [
            '開始' => date('H:i', $info['astronomical_twilight_begin']),
            '終了' => date('H:i', $info['astronomical_twilight_end'])
        ]
    ];
}

📝 実用的な応用例

1. 日照時間カレンダー

function generateSunlightCalendar($year, $month, $latitude, $longitude) {
    $calendar = [];
    $days = cal_days_in_month(CAL_GREGORIAN, $month, $year);

    for ($day = 1; $day <= $days; $day++) {
        $date = sprintf('%04d-%02d-%02d', $year, $month, $day);
        $info = date_sun_info(strtotime($date), $latitude, $longitude);

        $calendar[$day] = [
            'date' => $date,
            'sunrise' => date('H:i', $info['sunrise']),
            'sunset' => date('H:i', $info['sunset']),
            'daylight_hours' => round(($info['sunset'] - $info['sunrise']) / 3600, 2)
        ];
    }

    return $calendar;
}

2. 写真撮影のゴールデンアワー計算

function getGoldenHour($date, $latitude, $longitude) {
    $info = date_sun_info(strtotime($date), $latitude, $longitude);

    // 日の出/日の入り前後1時間をゴールデンアワーとする
    return [
        '朝' => [
            '開始' => date('H:i', $info['sunrise'] - 3600),
            '終了' => date('H:i', $info['sunrise'] + 3600)
        ],
        '夕' => [
            '開始' => date('H:i', $info['sunset'] - 3600),
            '終了' => date('H:i', $info['sunset'] + 3600)
        ]
    ];
}

⚠️ エラー処理

function safeSunInfo($date, $latitude, $longitude) {
    try {
        $timestamp = strtotime($date);
        if ($timestamp === false) {
            throw new Exception('Invalid date format');
        }

        if ($latitude < -90 || $latitude > 90) {
            throw new Exception('Invalid latitude');
        }

        if ($longitude < -180 || $longitude > 180) {
            throw new Exception('Invalid longitude');
        }

        $info = date_sun_info($timestamp, $latitude, $longitude);
        return [
            'success' => true,
            'data' => $info
        ];
    } catch (Exception $e) {
        return [
            'success' => false,
            'error' => $e->getMessage()
        ];
    }
}

💡 便利なユーティリティクラス

class SunCalculator {
    private $latitude;
    private $longitude;

    public function __construct($latitude, $longitude) {
        $this->latitude = $latitude;
        $this->longitude = $longitude;
    }

    public function getDaylightHours($date) {
        $info = date_sun_info(strtotime($date), $this->latitude, $this->longitude);
        return ($info['sunset'] - $info['sunrise']) / 3600;
    }

    public function isNightTime($time = null) {
        $time = $time ?? time();
        $info = date_sun_info($time, $this->latitude, $this->longitude);
        return $time < $info['sunrise'] || $time > $info['sunset'];
    }

    public function getNextSunrise() {
        $info = date_sun_info(time(), $this->latitude, $this->longitude);
        return date('Y-m-d H:i:s', $info['sunrise']);
    }
}

まとめ

date_sun_info()の主な特徴:

  • 太陽の様々な情報を取得可能
  • 緯度・経度による正確な計算
  • 薄明などの詳細な情報も入手可能
  • 天文学的な計算に活用可能

活用シーン:

  • 天文アプリケーション
  • 写真撮影支援
  • 日照時間の計算
  • アウトドアアプリケーション
タイトルとURLをコピーしました