必须设置PHP默认时区,推荐在php.ini中设为Asia/Shanghai并重启服务;共享主机等场景可用date_default_timezone_set()运行时设置,需置于脚本开头且使用IANA时区名。

PHP 默认时区为空,不显式设置会导致 date()、strtotime()、DateTime 等函数行为不可靠,尤其在跨服务器或处理时间计算时容易出错——必须设,且推荐设为应用所在业务时区(如 Asia/Shanghai)。
在 php.ini 中全局设置时区
这是最稳妥的方式,影响所有 PHP 脚本,避免单文件遗漏。修改前先确认你有权限编辑该配置文件(常见路径:/etc/php/*/apache2/php.ini 或 /usr/local/etc/php/php.ini)。
找到或添加这一行:
date.timezone = Asia/Shanghai
注意:Asia/Shanghai 是中国大陆标准时区,不是 PRC(已弃用)或 GMT+8(非时区标识符,PHP 不认)。改完重启 Web 服务(如 sudo systemctl restart apache2 或 sudo service php-fpm restart)。
立即学习“PHP免费学习笔记(深入)”;
- 若使用 Docker,可在
Dockerfile中用RUN echo "date.timezone = Asia/Shanghai" >> /usr/local/etc/php/php.ini - 共享主机通常禁止改
php.ini,此时需用运行时方式 -
date_default_timezone_set()无法覆盖php.ini中已设的值,但能覆盖未设或设为UTC的情况
在脚本中用 date_default_timezone_set() 运行时设置
适合开发调试、共享主机、或需按请求动态切换时区的场景。必须在调用任何时间相关函数前执行,否则会触发警告:
Warning: date(): It is not safe to rely on the system's timezone settings...
示例:
- 参数必须是 IANA 时区名(如
Asia/Shanghai、America/New_York),不能是缩写(CST)、偏移量(+08:00)或 Windows 时区名 - 建议放在入口文件(如
index.php)最顶部,或框架的初始化逻辑中 - 若多次调用
date_default_timezone_set(),以最后一次为准;但频繁切换易引发逻辑混乱,不推荐
验证时区是否生效
别只看 date() 输出,要查实际生效的时区名:
常见误判点:
-
ini_get('date.timezone')返回空,并不代表没设好——只要date_default_timezone_get()返回正确值(如Asia/Shanghai),说明运行时已生效 - CLI 和 Web SAPI 可能加载不同
php.ini,需分别验证(php -i | grep timezonevsphpinfo()) -
DateTime构造时不传时区,默认使用当前默认时区;但显式传了new DateTime('now', new DateTimeZone('UTC'))就会绕过默认设置
真正容易被忽略的是:时区设置不是“设一次就永远安全”。当项目引入第三方库(如某些 ORM 或日志组件)自行调用 date_default_timezone_set(),或部署到容器/无状态环境时配置未继承,问题会悄然复现。务必在部署后用 date_default_timezone_get() 检查,而不是只信配置文件里写了什么。











