PHP date_sun_info() 函数

date_sun_info() 函数返回一个包含指定日期和地点太阳信息的数组,包括日出时间、日落时间、太阳正午时间等。

注意:此函数在 PHP 5.1.2 及以上版本可用,需要系统支持天文计算。

语法

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度)

示例

示例 1:基本用法 - 获取北京的太阳信息

<?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
)
                            
示例 2:极昼极夜现象演示

<?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小时
                            
注意:在极昼/极夜地区,某些太阳事件可能不会发生,对应的返回值可能为0或负值。
示例 3:实际应用 - 日出日落时间查询工具

<?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
----------------------------------------
                            
晨昏蒙影(Twilight)说明
民用晨光 (Civil Twilight)

太阳在地平线下0-6度。足够明亮,可以进行户外活动,天空开始/结束发亮。

航海晨光 (Nautical Twilight)

太阳在地平线下6-12度。地平线仍然可见,可以进行航海观测。

天文晨光 (Astronomical Twilight)

太阳在地平线下12-18度。天空完全黑暗,可以进行天文观测。

注意事项

  • 时区影响:函数返回的是Unix时间戳,使用时需要考虑时区设置。建议使用 date_default_timezone_set() 设置正确的时区。
  • 精度限制:计算基于理想大气条件,实际观测可能因地形、天气和大气折射而有所不同。
  • 极地现象:在极圈内,某些太阳事件可能不会发生(如极昼/极夜),对应的时间戳可能为0或负值。
  • 系统要求:需要系统支持天文计算,大多数Unix-like系统都支持,Windows系统需要确保配置正确。
  • 海拔高度:此函数不考虑海拔高度的影响,实际应用中可能需要根据海拔进行调整。

相关函数

date_sunrise()

获取指定日期和地点的日出时间

date_sunset()

获取指定日期和地点的日落时间

date_sun_info() (本函数)

获取完整的太阳信息数组

strtotime()

将英文文本日期时间解析为Unix时间戳

date()

格式化本地时间/日期

date_default_timezone_set()

设置脚本中所有日期/时间函数使用的默认时区