date_sunrise() 函数已被废弃。建议使用 date_sun_info() 函数代替,该函数提供更全面的太阳信息。
date_sunrise() 函数返回指定日期和地点的日出时间。该函数基于天文计算,可以计算地球上任意地点的日出时间。
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 | 可选。返回值格式,可选常量:
|
$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 |
<?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
<?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
<?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_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
90.8333度 (90°50′)
默认值,考虑大气折射,太阳实际在地平线下约0.83度时视为日出。
90.0度
不考虑大气折射,太阳中心正好在地平线上时视为日出。
date_sun_info() 函数。$gmtOffset 参数处理时区,但更推荐使用 date_default_timezone_set()。false 或 "00:00"。date.default_latitude 和 date.default_longitude 的配置值。date_sun_info() 更高效。date_sun_info() (推荐)获取完整的太阳信息数组
date_sunset()获取指定日期和地点的日落时间
date_sunrise() (本函数)获取指定日期和地点的日出时间(已废弃)
date()格式化本地时间/日期
strtotime()将英文文本日期时间解析为Unix时间戳
date_default_timezone_set()设置脚本中所有日期/时间函数使用的默认时区