PHP 的 date_sunset() 函数用于根据给定的日期、经纬度等参数计算日落时间。然而,很多开发者在使用这个函数时,会发现它返回的结果并不准确,甚至与预期相差几个小时。这个问题看似是函数本身的 bug,实际上却与 PHP 的默认配置有关,尤其是的设置。
date_sunset() 的语法如下:
date_sunset(
int $timestamp,
int $format = SUNFUNCS_RET_STRING,
float $latitude = ini_get("date.default_latitude"),
float $longitude = ini_get("date.default_longitude"),
float $zenith = ini_get("date.sunset_zenith"),
float $gmt_offset = 0
): string|int|float|false
这个函数接受一个时间戳(通常是 strtotime() 的结果)和一系列地理参数,然后返回日落时间。关键在于最后一个参数:$gmt_offset,即 GMT 偏移量。
如果你不提供 $gmt_offset,PHP 会尝试用当前时区配置(即 date.timezone)来计算偏移量。如果时区设置不正确或未设置,计算结果将偏离实际值。
很多服务器出于兼容性考虑,PHP 的默认时区可能没有设置,或者设置成了 UTC。这意味着:
日落时间将以 UTC 时间返回,而不是本地时间;
如果你直接将这个时间输出或格式化为字符串,它将与你所在地区的真实日落时间不一致。
举个例子:
echo date_sunset(strtotime('2025-04-26'), SUNFUNCS_RET_STRING, 31.2304, 121.4737); // 上海坐标
在默认 UTC 时区下,返回可能是 "09:54",而你期望的却是傍晚的时间。
最推荐的方法是在脚本中显式设置所需的时区。例如:
date_default_timezone_set('Asia/Shanghai');
这会影响所有时间函数,包括 date_sunset()。配合上海坐标使用时,返回的时间就会是东八区时间。
如果你不想修改全局时区设置,也可以通过传入 $gmt_offset 参数来手动指定时区偏移。例如:
echo date_sunset(strtotime('2025-04-26'), SUNFUNCS_RET_STRING, 31.2304, 121.4737, 90.83, 8);
这里的最后一个参数 8 表示东八区(GMT+8)。
从服务器层面可以修改 PHP 配置文件(php.ini):
date.timezone = "Asia/Shanghai"
修改后记得重启 Web 服务器(如 Nginx 或 Apache)。
对于应用来说,始终显式设置时区 是最稳妥的方式;
对于框架项目,确保框架初始化中设置了默认时区;
对于部署到多地的系统,考虑根据用户位置动态调整 $gmt_offset。
date_sunset() 函数的行为依赖于当前的时区配置,如果你未正确设置 date.timezone 或 $gmt_offset,你得到的日落时间可能完全不准确。理解 PHP 如何处理时区,并根据需要合理设置,是使用这类时间函数的关键。
在开发和部署过程中,记得检查你的 PHP 配置,避免出现让人困惑的时间错误。