PHP date_sunrise() 函数

重要提醒:从 PHP 8.0.0 开始,date_sunrise() 函数已被废弃。建议使用 date_sun_info() 函数代替,该函数提供更全面的太阳信息。

date_sunrise() 函数返回指定日期和地点的日出时间。该函数基于天文计算,可以计算地球上任意地点的日出时间。

版本说明:此函数在 PHP 5.1.2 中引入,但在 PHP 8.0.0 中被标记为废弃。建议使用 date_sun_info() 函数。

语法

date_sunrise(
    int $timestamp,
    int $returnFormat = SUNFUNCS_RET_STRING,
    float $latitude = null,
    float $longitude = null,
    float $zenith = null,
    float $gmtOffset = 0
): mixed

参数

参数 类型 默认值 描述
$timestamp int 必需。Unix时间戳,表示要计算的日期
$returnFormat int SUNFUNCS_RET_STRING 可选。返回值格式,可选常量:
  • SUNFUNCS_RET_STRING - 返回字符串格式的时间(默认)
  • SUNFUNCS_RET_DOUBLE - 返回浮点数(小时数)
  • SUNFUNCS_RET_TIMESTAMP - 返回Unix时间戳
$latitude float ini_get("date.default_latitude") 可选。地点的纬度,北纬为正数,南纬为负数(范围:-90 到 90)
$longitude float ini_get("date.default_longitude") 可选。地点的经度,东经为正数,西经为负数(范围:-180 到 180)
$zenith float ini_get("date.sunrise_zenith") 可选。日出天顶角,默认约90.83度(大气折射考虑)
$gmtOffset float 0 可选。相对于GMT的时区偏移(小时),例如北京为+8

返回值

返回值类型 $returnFormat 值 描述
string SUNFUNCS_RET_STRING 返回格式化的时间字符串,如 "06:45"
float SUNFUNCS_RET_DOUBLE 返回浮点数表示的小时数,如 6.75(表示6:45)
int SUNFUNCS_RET_TIMESTAMP 返回Unix时间戳
false 任意 如果计算失败(如在极夜地区),返回 false

示例

示例 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');

// 不同格式获取日出时间
echo "北京(北纬39.9°,东经116.4°)2023年夏至的日出时间:\n\n";

// 1. 字符串格式(默认)
$sunrise_string = date_sunrise($timestamp, SUNFUNCS_RET_STRING, $latitude, $longitude);
echo "字符串格式: " . $sunrise_string . "\n";

// 2. 浮点数格式(小时)
$sunrise_double = date_sunrise($timestamp, SUNFUNCS_RET_DOUBLE, $latitude, $longitude);
echo "浮点数格式: " . $sunrise_double . " 小时\n";

// 3. 时间戳格式
$sunrise_timestamp = date_sunrise($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude);
echo "时间戳格式: " . $sunrise_timestamp . "\n";
echo "转换为时间: " . date('Y-m-d H:i:s', $sunrise_timestamp) . "\n";
?>
                            

输出:


北京(北纬39.9°,东经116.4°)2023年夏至的日出时间:

字符串格式: 04:46
浮点数格式: 4.7666666666667 小时
时间戳格式: 1687369560
转换为时间: 2023-06-21 04:46:00
                            
示例 2:使用天顶角参数

<?php
// 设置默认时区
date_default_timezone_set('Asia/Shanghai');

// 北京坐标
$latitude = 39.9;
$longitude = 116.4;
$timestamp = strtotime('2023-06-21');

// 不同天顶角下的日出时间
echo "不同天顶角对日出时间的影响(北京,2023年夏至):\n\n";

// 标准天顶角(考虑大气折射)
$standard_zenith = 90 + (50 / 60); // 90度50分
$sunrise_standard = date_sunrise($timestamp, SUNFUNCS_RET_STRING, $latitude, $longitude, $standard_zenith);
echo "标准天顶角 (90°50′): " . $sunrise_standard . "\n";

// 几何天顶角(不考虑大气折射)
$geometric_zenith = 90.0;
$sunrise_geometric = date_sunrise($timestamp, SUNFUNCS_RET_STRING, $latitude, $longitude, $geometric_zenith);
echo "几何天顶角 (90°00′): " . $sunrise_geometric . "\n";

// 民用晨光(太阳在地平线下6度)
$civil_zenith = 96.0; // 90 + 6
$sunrise_civil = date_sunrise($timestamp, SUNFUNCS_RET_STRING, $latitude, $longitude, $civil_zenith);
echo "民用晨光 (96°00′): " . $sunrise_civil . "\n";

// 航海晨光(太阳在地平线下12度)
$nautical_zenith = 102.0; // 90 + 12
$sunrise_nautical = date_sunrise($timestamp, SUNFUNCS_RET_STRING, $latitude, $longitude, $nautical_zenith);
echo "航海晨光 (102°00′): " . $sunrise_nautical . "\n";

// 天文晨光(太阳在地平线下18度)
$astronomical_zenith = 108.0; // 90 + 18
$sunrise_astronomical = date_sunrise($timestamp, SUNFUNCS_RET_STRING, $latitude, $longitude, $astronomical_zenith);
echo "天文晨光 (108°00′): " . $sunrise_astronomical . "\n";
?>
                            

输出:


不同天顶角对日出时间的影响(北京,2023年夏至):

标准天顶角 (90°50′): 04:46
几何天顶角 (90°00′): 04:44
民用晨光 (96°00′): 04:18
航海晨光 (102°00′): 03:42
天文晨光 (108°00′): 03:02
                            
提示:天顶角决定了什么被认为是"日出"。标准天顶角考虑了大气折射,所以太阳实际上还在地平线下约50分(约0.83度)时,我们就看到了日出。
示例 3:极地现象处理

<?php
// 设置默认时区
date_default_timezone_set('UTC');

// 测试不同纬度的日出情况
function testSunrise($location, $latitude, $longitude, $date) {
    $timestamp = strtotime($date);
    $sunrise = date_sunrise($timestamp, SUNFUNCS_RET_STRING, $latitude, $longitude);

    if ($sunrise === false) {
        return "{$location}: 没有日出(极夜)";
    } elseif (strpos($sunrise, '00:00') === 0) {
        return "{$location}: 极昼(太阳全天不落)";
    } else {
        return "{$location}: 日出时间 {$sunrise}";
    }
}

echo "2023年不同纬度在6月21日(夏至)的日出情况:\n\n";

// 不同纬度测试
echo testSunrise("北极点 (90°N)", 90.0, 0.0, '2023-06-21') . "\n";
echo testSunrise("北极圈内 (70°N)", 70.0, 0.0, '2023-06-21') . "\n";
echo testSunrise("北京 (40°N)", 39.9, 116.4, '2023-06-21') . "\n";
echo testSunrise("赤道 (0°)", 0.0, 0.0, '2023-06-21') . "\n";
echo testSunrise("悉尼 (34°S)", -33.9, 151.2, '2023-06-21') . "\n";
echo testSunrise("南极圈内 (70°S)", -70.0, 0.0, '2023-06-21') . "\n";
echo testSunrise("南极点 (90°S)", -90.0, 0.0, '2023-06-21') . "\n";

echo "\n2023年不同纬度在12月21日(冬至)的日出情况:\n\n";

echo testSunrise("北极点 (90°N)", 90.0, 0.0, '2023-12-21') . "\n";
echo testSunrise("北极圈内 (70°N)", 70.0, 0.0, '2023-12-21') . "\n";
echo testSunrise("北京 (40°N)", 39.9, 116.4, '2023-12-21') . "\n";
echo testSunrise("赤道 (0°)", 0.0, 0.0, '2023-12-21') . "\n";
echo testSunrise("悉尼 (34°S)", -33.9, 151.2, '2023-12-21') . "\n";
echo testSunrise("南极圈内 (70°S)", -70.0, 0.0, '2023-12-21') . "\n";
echo testSunrise("南极点 (90°S)", -90.0, 0.0, '2023-12-21') . "\n";
?>
                            

输出:


2023年不同纬度在6月21日(夏至)的日出情况:

北极点 (90°N): 极昼(太阳全天不落)
北极圈内 (70°N): 极昼(太阳全天不落)
北京 (40°N): 日出时间 04:46
赤道 (0°): 日出时间 06:00
悉尼 (34°S): 日出时间 07:00
南极圈内 (70°S): 没有日出(极夜)
南极点 (90°S): 没有日出(极夜)

2023年不同纬度在12月21日(冬至)的日出情况:

北极点 (90°N): 没有日出(极夜)
北极圈内 (70°N): 没有日出(极夜)
北京 (40°N): 日出时间 07:32
赤道 (0°): 日出时间 06:00
悉尼 (34°S): 日出时间 05:41
南极圈内 (70°S): 极昼(太阳全天不落)
南极点 (90°S): 极昼(太阳全天不落)
                            
替代方案:使用 date_sun_info()

由于 date_sunrise() 在 PHP 8.0+ 中被废弃,推荐使用 date_sun_info() 函数:


<?php
// 使用 date_sun_info() 替代 date_sunrise()
$timestamp = strtotime('2023-06-21');
$latitude = 39.9;
$longitude = 116.4;

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

echo "使用 date_sun_info() 获取日出时间:\n";
echo "日出时间戳: " . $sun_info['sunrise'] . "\n";
echo "日出时间: " . date('H:i', $sun_info['sunrise']) . "\n\n";

echo "完整的太阳信息:\n";
foreach ($sun_info as $key => $value) {
    if (is_int($value)) {
        echo "{$key}: " . date('H:i:s', $value) . "\n";
    } else {
        echo "{$key}: {$value}\n";
    }
}
?>
                            

输出:


使用 date_sun_info() 获取日出时间:
日出时间戳: 1687369560
日出时间: 04:46

完整的太阳信息:
sunrise: 04:46:00
sunset: 19:46:00
transit: 12:16:00
civil_twilight_begin: 04:18:00
civil_twilight_end: 20:14:00
nautical_twilight_begin: 03:42:00
nautical_twilight_end: 20:50:00
astronomical_twilight_begin: 03:02:00
astronomical_twilight_end: 21:30:00
                            
天顶角(Zenith)说明
标准天顶角

90.8333度 (90°50′)
默认值,考虑大气折射,太阳实际在地平线下约0.83度时视为日出。

几何天顶角

90.0度
不考虑大气折射,太阳中心正好在地平线上时视为日出。

常用天顶角
  • 96度:民用晨光(太阳在地平线下6度)
  • 102度:航海晨光(太阳在地平线下12度)
  • 108度:天文晨光(太阳在地平线下18度)

注意事项

  • 废弃状态:从 PHP 8.0.0 开始,此函数已被废弃。新代码应使用 date_sun_info() 函数。
  • 时区处理:函数使用 $gmtOffset 参数处理时区,但更推荐使用 date_default_timezone_set()
  • 极地现象:在极昼/极夜地区,函数可能返回 false 或 "00:00"。
  • 精度限制:计算基于理想大气条件,实际观测可能因地形和天气而不同。
  • 默认坐标:如果未提供纬度和经度,会使用 date.default_latitudedate.default_longitude 的配置值。
  • 性能考虑:如果需要获取多个太阳事件(日出、日落等),使用 date_sun_info() 更高效。

相关函数

date_sun_info() (推荐)

获取完整的太阳信息数组

date_sunset()

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

date_sunrise() (本函数)

获取指定日期和地点的日出时间(已废弃)

date()

格式化本地时间/日期

strtotime()

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

date_default_timezone_set()

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