最稳妥的方式是分别修改 phpenv 中每个 php 版本对应的 php.ini 文件的 date.timezone = "asia/shanghai" 并重启 apache 与 cli 对应服务,而非依赖 date_default_timezone_set();因 phpenv 多版本共存且 web/cli 可能加载不同配置,未统一设置会导致时间差 8 小时、日志错乱及 strtotime() 解析失败等问题。

phpEnv 是 Windows 下的 PHP 集成环境(类似 XAMPP、WAMP),它默认不设时区,date() 等函数会触发警告并 fallback 到系统时区——这往往导致时间差 8 小时、日志错乱、strtotime() 解析失败等问题。最稳妥的做法是直接改 phpEnv 所用的 php.ini,而不是依赖运行时函数。
找到 phpEnv 正在用的 php.ini 文件
phpEnv 多版本共存,每个 PHP 版本都有独立配置,不能只改一个。你需要确认当前 Web 请求或 CLI 命令实际加载的是哪个 php.ini:
- 新建一个
info.php放在网站根目录,内容为<?php phpinfo(); ?>,访问后查找 “Loaded Configuration File” 行 - CLI 下执行
php --ini,看 “Loaded configuration file” 路径 - 常见路径如:
C:\phpEnv\php\php-8.2.0\php.ini或C:\phpEnv\php\php-7.4.33\php.ini
注意:phpEnv 的 Apache 和 CLI 可能用不同版本的 PHP,对应不同的 php.ini,必须分别确认并修改。
修改 php.ini 中的 date.timezone
打开对应 php.ini,搜索 date.timezone。如果没找到,就在 [Date] 段落末尾手动添加;如果已存在但被注释(行首有分号 ;),就删掉分号。
设置值必须是 IANA 时区标识符,不能写 GMT+8、UTC+8 或 PRC(PRC 虽然旧版能识别,但已废弃,PHP 8+ 可能报错):
date.timezone = "Asia/Shanghai"
保存后,必须重启 phpEnv 的 Apache 服务(不是只刷新网页)——点击 phpEnv 控制面板里的 “Restart Apache” 按钮,否则修改完全不生效。
date_default_timezone_set() 在 phpEnv 中的坑
虽然你可以在脚本开头加 date_default_timezone_set("Asia/Shanghai"),但在 phpEnv 场景下容易出问题:
- Web 请求和 CLI 命令(如 Composer、Artisan)可能走不同入口,漏设一个就出时间偏差
- 某些扩展(比如
intl的IntlDateFormatter)仍读取php.ini的date.timezone,不认这个函数设置 - 框架的自动加载机制(如 Composer autoloader)可能在你调用该函数前就触发了
DateTime构造,导致警告提前抛出 - phpEnv 默认启用
display_errors = On,未设时区的警告会直接输出到页面顶部,破坏 JSON 或 HTML 结构
验证是否真正生效
别只信 date_default_timezone_get() 返回值——它只反映 PHP 层面的设置。要真正确认,得测实际行为:
- 写一段脚本:
echo date('Y-m-d H:i:s') . ' | ' . date_default_timezone_get();,对比服务器本地时间 - 检查错误日志:如果还看到
It is not safe to rely on the system's timezone settings,说明某个地方的php.ini没改对,或没重启服务 - 运行
php -r "echo date('Y-m-d H:i:s');"测试 CLI 环境,和 Web 环境结果应一致
phpEnv 的复杂性在于它把多个 PHP 实例、Apache 模块、CLI 二进制混在一起管理,时区必须在每个实际生效的 php.ini 里单独配,且每次换 PHP 版本都要重做一遍——这点很容易被忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











