こんにちは!今回は、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()
の主な特徴:
- 太陽の様々な情報を取得可能
- 緯度・経度による正確な計算
- 薄明などの詳細な情報も入手可能
- 天文学的な計算に活用可能
活用シーン:
- 天文アプリケーション
- 写真撮影支援
- 日照時間の計算
- アウトドアアプリケーション