首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

解決 PHP "It is not safe to rely on the system's timezone settings" 警告

     編輯:PHP 相關知識

PHP 5.1+ 版本在使用 date()、time() 等日期時間函數時,若未顯式設置時區,會拋出 E_WARNING:

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 'UTC' for '8.0/no DST' instead.

根因

PHP 默認使用 UTC(格林威治標準時間),與中國標準時間(CST,UTC+8)相差 8 小時。未設置時區會導致業務邏輯時間偏移、日誌難以排查、定時任務錯亂。

解決方案(三選一,推薦方案二)

方案一:代碼層面設置(靈活、項目級)

在項目入口文件(如 index.php、common.php、框架 Bootstrap)最早處調用:

<?php
// 設置為中國標準時間(PRC = People's Republic of China)
date_default_timezone_set('PRC');
// 或等價寫法
date_default_timezone_set('Asia/Shanghai');
date_default_timezone_set('Asia/Chongqing');

優點:無需改動服務器配置,代碼可移植,適合共享主機、無 php.ini 權限場景。
缺點:每個入口都要寫,CLI 腳本、定時任務、獨立腳本易漏寫。

方案二:php.ini 全局設置(推薦、一次配置永久生效)

  1. 定位 php.ini:php --ini 或 phpinfo() 查看 Loaded Configuration File
  2. 搜索 date.timezone,修改為:
date.timezone = PRC
  1. 去掉行首分號 ; 取消註釋
  2. 重啟 PHP-FPM / Apache:systemctl restart php-fpm 或 service httpd restart

優點:全局生效,覆蓋 Web、CLI、定時任務所有場景,維護成本最低。
注意:時區標識符必須來自 PHP 官方時區列表,常用:PRC、Asia/Shanghai、Asia/Chongqing、UTC、America/New_York。

方案三:Nginx/Apache 虛擬主機級別設置(多項目不同時區)

Nginx + PHP-FPM(fastcgi_param):

location ~ \.php$ {
    fastcgi_param PHP_VALUE "date.timezone=PRC";
    # ...
}

Apache(.htaccess 或虛擬主機配置):

php_value date.timezone PRC

驗證生效

<?php
echo '當前時區: ' . date_default_timezone_get() . PHP_EOL;
echo '當前時間: ' . date('Y-m-d H:i:s') . PHP_EOL;
echo '時間戳: ' . time() . PHP_EOL;
// 輸出應為 CST 時區時間,無 Warning

常見誤區

  • 寫錯時區標識符:如 CST、GMT+8、China 均無效,必須用 PRC 或 Asia/Shanghai。
  • 修改錯誤的 php.ini:CLI 與 FPM 可能加載不同配置文件,務必用 php --ini 確認。
  • 未重啟服務:修改 php.ini 必須重啟 PHP 進程生效。

總結

生產環境**強烈建議修改 php.ini 設置 date.timezone = PRC**,一次配置、全局生效、零代碼入侵。開發環境或無權限場景可用 date_default_timezone_set('PRC') 兜底。解決該警告不僅消除錯誤日誌噪音,更是保障業務時間準確性的基礎建設。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved