php时区设置需分三层:php.ini修改须重启服务,ini_set仅当前请求有效,date_default_timezone_set最推荐且优先级最高;cli与web配置文件独立;容器/云环境还需同步系统时区。

PHP时区设置改了 date.timezone 但没生效?先看改在哪
修改 PHP 时区后是否需要重启服务,完全取决于你改的是哪个配置层级。不是所有修改都“热生效”,也不是所有地方改了都管用。
常见修改位置有三处:php.ini 全局配置、ini_set() 运行时设置、date_default_timezone_set() 脚本内设置。它们的生效范围和时机完全不同。
-
php.ini中修改date.timezone:必须重启 PHP-FPM 或 Apache/NGINX(取决于 SAPI 类型),否则不加载新值 -
ini_set('date.timezone', 'Asia/Shanghai'):仅对当前请求生命周期有效,无需重启,但不能在已调用date()等函数后才设(会触发警告) -
date_default_timezone_set('Asia/Shanghai'):推荐方式,脚本开头调用即可,优先级最高,覆盖 php.ini 和 ini_set 的设置
为什么 phpinfo() 显示的时区和 date() 输出不一致?
这是典型的时间初始化顺序问题。PHP 在脚本启动时会读取 date.timezone 配置并缓存时区信息;如果此时配置未就位(比如被 ini_set() 晚于首次 date() 调用才设置),就会 fallback 到 UTC 或系统默认。
- 错误写法:
echo date('Y-m-d H:i:s'); // 此时已触发默认时区初始化 ini_set('date.timezone', 'Asia/Shanghai'); echo date('Y-m-d H:i:s'); // 仍可能输出 UTC 时间 - 正确做法:始终把
date_default_timezone_set()放在脚本最前面,或在框架入口统一设置 - 验证方式:不要只看
phpinfo(),用date_default_timezone_get()获取当前实际生效的时区
CLI 和 Web SAPI 的时区配置是分开的?
是的。PHP CLI 和 Web(如 PHP-FPM)通常使用不同的 php.ini 文件,比如 /etc/php/8.1/cli/php.ini 和 /etc/php/8.1/fpm/php.ini。改错文件会导致一个环境生效、另一个不生效。
立即学习“PHP免费学习笔记(深入)”;
- 查 CLI 当前配置:
php -i | grep "Loaded Configuration File" - 查 FPM 当前配置:在 Web 脚本中运行
phpinfo(),或执行php-fpm -t && php-fpm -i | grep "Loaded Configuration File" - 改完对应
php.ini后:systemctl reload php8.1-fpm(FPM)或直接重起 CLI 不需要操作(但下次运行才生效)
容器或云环境里改时区容易漏掉系统层
Docker 容器或某些云函数平台中,PHP 进程可能继承宿主机时区,而 date.timezone 只影响 PHP 内部时间函数,不影响 gettimeofday()、stat() 返回的文件时间等底层行为。
- PHP 层面设了
Asia/Shanghai,但filemtime()返回的时间戳转成字符串仍像 UTC?检查是否忘了同步系统时区 - Docker 中建议同时设置:
-e TZ=Asia/Shanghai+RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime - 云函数(如阿里云 FC、腾讯 SCF)通常禁止修改系统时区,只能依赖
date_default_timezone_set(),且必须在 handler 入口第一行调用











