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 配置,避免出現讓人困惑的時間錯誤。