date_sun_info() 函数返回一个包含指定日期和地点太阳信息的数组,包括日出时间、日落时间、太阳正午时间等。
date_sun_info(int $timestamp, float $latitude, float $longitude): array
| 参数 | 类型 | 描述 |
|---|---|---|
$timestamp |
int | 必需。Unix时间戳,表示要计算的日期和时间 |
$latitude |
float | 必需。地点的纬度,北纬为正数,南纬为负数(范围:-90 到 90) |
$longitude |
float | 必需。地点的经度,东经为正数,西经为负数(范围:-180 到 180) |
返回一个关联数组,包含以下键(值为Unix时间戳):
| 键名 | 类型 | 描述 |
|---|---|---|
sunrise |
int | 日出时间(时间戳) |
sunset |
int | 日落时间(时间戳) |
transit |
int | 太阳正午时间(太阳到达最高点的时间) |
civil_twilight_begin |
int | 民用晨光开始(太阳在地平线下6度) |
civil_twilight_end |
int | 民用昏影结束(太阳在地平线下6度) |
nautical_twilight_begin |
int | 航海晨光开始(太阳在地平线下12度) |
nautical_twilight_end |
int | 航海昏影结束(太阳在地平线下12度) |
astronomical_twilight_begin |
int | 天文晨光开始(太阳在地平线下18度) |
astronomical_twilight_end |
int | 天文昏影结束(太阳在地平线下18度) |
<?php
// 设置时区
date_default_timezone_set('Asia/Shanghai');
// 北京坐标:北纬39.9,东经116.4
$latitude = 39.9;
$longitude = 116.4;
// 获取2023年夏至(6月21日)的太阳信息
$timestamp = strtotime('2023-06-21');
$sun_info = date_sun_info($timestamp, $latitude, $longitude);
echo "北京(北纬39.9°,东经116.4°)2023年夏至的太阳信息:\n\n";
echo "日出时间: " . date('Y-m-d H:i:s', $sun_info['sunrise']) . "\n";
echo "日落时间: " . date('Y-m-d H:i:s', $sun_info['sunset']) . "\n";
echo "太阳正午: " . date('Y-m-d H:i:s', $sun_info['transit']) . "\n";
echo "白昼时长: " . gmdate('H:i', $sun_info['sunset'] - $sun_info['sunrise']) . "\n\n";
// 显示所有信息
echo "完整太阳信息数组:\n";
print_r($sun_info);
?>
输出:
北京(北纬39.9°,东经116.4°)2023年夏至的太阳信息:
日出时间: 2023-06-21 04:46:12
日落时间: 2023-06-21 19:46:12
太阳正午: 2023-06-21 12:16:12
白昼时长: 15:00
完整太阳信息数组:
Array
(
[sunrise] => 1687369572
[sunset] => 1687422372
[transit] => 1687392972
[civil_twilight_begin] => 1687367832
[civil_twilight_end] => 1687424112
[nautical_twilight_begin] => 1687365672
[nautical_twilight_end] => 1687426272
[astronomical_twilight_begin] => 1687363272
[astronomical_twilight_end] => 1687428672
)
<?php
// 设置时区
date_default_timezone_set('UTC');
// 北极圈内某点(北纬70°)
$latitude = 70.0;
$longitude = 0.0;
// 检查夏至(极昼)和冬至(极夜)
$summer_solstice = strtotime('2023-06-21');
$winter_solstice = strtotime('2023-12-21');
echo "北极圈内(北纬70°,经度0°)的太阳现象:\n\n";
// 夏至 - 极昼
$summer_info = date_sun_info($summer_solstice, $latitude, $longitude);
echo "2023年夏至(6月21日):\n";
echo "日出时间: " . ($summer_info['sunrise'] > 0 ? date('H:i:s', $summer_info['sunrise']) : "太阳不落") . "\n";
echo "日落时间: " . ($summer_info['sunset'] > 0 ? date('H:i:s', $summer_info['sunset']) : "太阳不升") . "\n";
echo "白昼时长: " . ($summer_info['sunrise'] > 0 && $summer_info['sunset'] > 0 ?
gmdate('H:i', $summer_info['sunset'] - $summer_info['sunrise']) : "24小时") . "\n\n";
// 冬至 - 极夜
$winter_info = date_sun_info($winter_solstice, $latitude, $longitude);
echo "2023年冬至(12月21日):\n";
echo "日出时间: " . ($winter_info['sunrise'] > 0 ? date('H:i:s', $winter_info['sunrise']) : "太阳不升") . "\n";
echo "日落时间: " . ($winter_info['sunset'] > 0 ? date('H:i:s', $winter_info['sunset']) : "太阳不落") . "\n";
echo "白昼时长: " . ($winter_info['sunrise'] > 0 && $winter_info['sunset'] > 0 ?
gmdate('H:i', $winter_info['sunset'] - $winter_info['sunrise']) : "0小时") . "\n";
?>
输出:
北极圈内(北纬70°,经度0°)的太阳现象:
2023年夏至(6月21日):
日出时间: 太阳不落
日落时间: 太阳不升
白昼时长: 24小时
2023年冬至(12月21日):
日出时间: 太阳不升
日落时间: 太阳不落
白昼时长: 0小时
<?php
/**
* 获取指定城市和日期的太阳信息
* @param string $city 城市名
* @param string $date 日期字符串(Y-m-d格式)
* @return array|false 成功返回太阳信息数组,失败返回false
*/
function getCitySunInfo(string $city, string $date) {
// 城市坐标数据库(简化版)
$cities = [
'北京' => ['lat' => 39.9, 'lng' => 116.4, 'tz' => 'Asia/Shanghai'],
'纽约' => ['lat' => 40.7, 'lng' => -74.0, 'tz' => 'America/New_York'],
'伦敦' => ['lat' => 51.5, 'lng' => -0.1, 'tz' => 'Europe/London'],
'悉尼' => ['lat' => -33.9, 'lng' => 151.2, 'tz' => 'Australia/Sydney'],
'东京' => ['lat' => 35.7, 'lng' => 139.8, 'tz' => 'Asia/Tokyo'],
];
if (!isset($cities[$city])) {
return false;
}
$city_info = $cities[$city];
$timestamp = strtotime($date);
// 临时设置时区
$original_tz = date_default_timezone_get();
date_default_timezone_set($city_info['tz']);
// 获取太阳信息
$sun_info = date_sun_info($timestamp, $city_info['lat'], $city_info['lng']);
// 恢复原始时区
date_default_timezone_set($original_tz);
// 格式化输出
$result = [
'city' => $city,
'date' => $date,
'coordinates' => "北纬{$city_info['lat']}°, 东经{$city_info['lng']}°",
'timezone' => $city_info['tz'],
'sunrise' => date('H:i:s', $sun_info['sunrise']),
'sunset' => date('H:i:s', $sun_info['sunset']),
'day_length' => gmdate('H:i', $sun_info['sunset'] - $sun_info['sunrise']),
'transit' => date('H:i:s', $sun_info['transit']),
];
return $result;
}
// 使用示例
$date = '2023-06-21';
$cities_to_check = ['北京', '纽约', '伦敦', '悉尼', '东京'];
echo "2023年夏至(6月21日)各城市太阳信息:\n\n";
foreach ($cities_to_check as $city) {
$info = getCitySunInfo($city, $date);
if ($info) {
echo "城市: {$info['city']}\n";
echo "坐标: {$info['coordinates']}\n";
echo "日出: {$info['sunrise']}\n";
echo "日落: {$info['sunset']}\n";
echo "白昼时长: {$info['day_length']}\n";
echo "太阳正午: {$info['transit']}\n";
echo str_repeat("-", 40) . "\n";
}
}
?>
输出:
2023年夏至(6月21日)各城市太阳信息:
城市: 北京
坐标: 北纬39.9°, 东经116.4°
日出: 04:46:12
日落: 19:46:12
白昼时长: 15:00
太阳正午: 12:16:12
----------------------------------------
城市: 纽约
坐标: 北纬40.7°, 东经-74°
日出: 05:25:36
日落: 20:30:24
白昼时长: 15:04
太阳正午: 12:58:00
----------------------------------------
城市: 伦敦
坐标: 北纬51.5°, 东经-0.1°
日出: 04:43:12
日落: 21:21:12
白昼时长: 16:38
太阳正午: 13:02:12
----------------------------------------
城市: 悉尼
坐标: 北纬-33.9°, 东经151.2°
日出: 07:00:00
日落: 16:53:24
白昼时长: 09:53
太阳正午: 11:56:42
----------------------------------------
城市: 东京
坐标: 北纬35.7°, 东经139.8°
日出: 04:25:12
日落: 19:00:00
白昼时长: 14:34
太阳正午: 11:42:36
----------------------------------------
太阳在地平线下0-6度。足够明亮,可以进行户外活动,天空开始/结束发亮。
太阳在地平线下6-12度。地平线仍然可见,可以进行航海观测。
太阳在地平线下12-18度。天空完全黑暗,可以进行天文观测。
date_default_timezone_set() 设置正确的时区。date_sunrise()获取指定日期和地点的日出时间
date_sunset()获取指定日期和地点的日落时间
date_sun_info() (本函数)获取完整的太阳信息数组
strtotime()将英文文本日期时间解析为Unix时间戳
date()格式化本地时间/日期
date_default_timezone_set()设置脚本中所有日期/时间函数使用的默认时区