PHP 5.3+ 預設要求明確設定時區,否則呼叫 date()、time() 等函數會拋出 Warning: date(): It is not safe to rely on the system's timezone settings...。本文提供兩種標準解決方案與最佳實踐建議。
PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no DST' instead in /path/file.php on line 542
<?php
// 腳本最頂端,在任何 date() 呼叫之前
date_default_timezone_set('PRC'); // 或 'Asia/Shanghai', 'Asia/Taipei'
echo date('Y-m-d H:i:s'); // 正常輸出,無警告
?>
缺點:每支腳本都需加入,專案擴大時維護困難。
php.ini 位置:php --ini 或 phpinfo()date.timezonedate.timezone = PRC (或 Asia/Shanghai, Asia/Taipei); php.ini [Date] ; Defines the default timezone used by the date functions date.timezone = PRC
| 識別碼 | 說明 | 適用地區 |
|---|---|---|
| PRC | 中華人民共和國別名 | 中國大陸 (推薦) |
| Asia/Shanghai | 上海時區 (UTC+8) | 中國大陸、標準 IANA 格式 |
| Asia/Chongqing | 重慶時區 (UTC+8) | 中國大陸、PHP 預設回退值 |
| Asia/Taipei | 台北時區 (UTC+8) | 台灣地區 |
| Asia/Hong_Kong | 香港時區 (UTC+8) | 香港特別行政區 |
| Asia/Macau | 澳門時區 (UTC+8) | 澳門特別行政區 |
注意:CST 歧義性極高 (China/US/Cuba/Australia Standard Time),嚴禁使用,務必使用具體 IANA 識別碼。
<?php
echo '目前時區: ' . date_default_timezone_get() . "<br>";
echo '目前時間: ' . date('Y-m-d H:i:s') . "<br>";
echo '時間戳: ' . time() . "<br>";
// 若無警告輸出,設定成功
?>
| 誤區 | 正確做法 |
|---|---|
以為 date('Y-m-d H:i:s') 參數格式錯誤導致警告 | 警告與格式無關,純粹是時區未設定。格式錯誤只會輸出錯誤字串不報警 |
| 設定了 date.timezone 但仍報警 | 1. 拼寫錯誤 (如 Asia/Shangai 少 e) 2. 改錯 php.ini (cli vs fpm) 3. 未重啟服務 4. 程式碼中再次呼叫 date_default_timezone_set() 覆蓋 |
| Docker 容器中設定無效 | 在 Dockerfile 中 RUN echo "date.timezone=PRC" >> /usr/local/etc/php/conf.d/timezone.ini |
.user.ini 或 php.ini 設定時區,納入版控PHP_INI_SCAN_DIR 注入時區配置config/app.php 的 'timezone' => 'PRC'時區設定是 PHP 專案上線前的必做檢查項。統一使用 PRC 或 Asia/Shanghai,配合 CI/CD 自動驗證,能徹底消除這類低級警告,讓日誌專注於真正的業務錯誤。