必须修改 php.ini 中的 date.timezone = asia/shanghai,并同步更新 thinkphp 的 config/app.php 中 default_timezone,同时配置 mysql 的 default-time-zone = '+08:00',否则 cli 与 web 时区不一致、模型时间戳偏差等问题将持续存在。

必须改 php.ini,而不是只在代码里调用 date_default_timezone_set() —— 否则 CLI 和 Web 请求时区不一致、自动加载阶段时间就错、模型写入时间戳仍偏差,问题会反复出现。
确认你改的是正确的 php.ini 文件
XAMPP 有两个常见位置的 php.ini:一个是 Apache 用的(XAMPP\php\php.ini),另一个是 CLI(命令行)用的(XAMPP\php\php.ini 实际也是它,但部分安装可能有独立副本)。
运行 php --ini 查看 CLI 加载路径,访问 http://localhost/dashboard/phpinfo.php 查看 Web 模式加载路径。两个环境必须指向同一份生效配置,或至少都设对 date.timezone。
常见错误:只改了 Apache 的 php.ini,结果 php think schedule:run 还是 UTC 时间。
date.timezone = Asia/Shanghai 是唯一推荐值
不要用 PRC(PHP 8.4+ 已废弃)、+08:00、Etc/GMT-8 或 GMT+8:
• PRC 在新版 PHP 中触发警告,且部分容器环境不识别
• Etc/GMT-8 是 POSIX 反向命名法,实际代表 UTC+8,但语义混乱、易误读
• +08:00 不是合法时区标识符,date_default_timezone_set() 会静默失败
• 正确写法只有 Asia/Shanghai(或 Asia/Chongqing,效果相同)
修改后务必重启 Apache 和 MySQL 服务(XAMPP 控制面板点“Stop All”再“Start All”)
ThinkPHP 6+ 用户额外注意 config/app.php 中的 default_timezone
即使 php.ini 已设对,ThinkPHP 6+ 仍会主动调用 date_default_timezone_set('UTC') 启动时覆盖——这是设计行为,不是 bug。
所以必须显式覆盖框架配置:
• 打开 config/app.php
• 找到 'default_timezone' => 'UTC' 这一行(不是注释,是实际生效的键)
• 改为 'default_timezone' => 'Asia/Shanghai'
• 切勿写成 'Asia/Shanghai '(尾部空格会导致 date_default_timezone_get() 返回空字符串)
验证方式:在控制器加 dump(date_default_timezone_get(), date('Y-m-d H:i:s'));,两个输出都应是北京时间
数据库时间字段仍差 8 小时?检查 MySQL 服务端时区
PHP 时区设对 ≠ 数据库时间正确。MySQL 默认使用系统时区,但 XAMPP 自带的 MySQL 可能仍为 SYSTEM 且系统时区未同步。
执行 SQL:SELECT @@global.time_zone, @@session.time_zone;
理想返回是 SYSTEM 和 SYSTEM,且系统本身时区为 Asia/Shanghai。
若返回 UTC 或 +00:00:
• 编辑 XAMPP\mysql\bin\my.ini
• 在 [mysqld] 下添加:default-time-zone = '+08:00'
• 重启 MySQL
更稳妥做法:模型时间戳字段类型统一用 int 存 Unix 时间戳,彻底绕过格式化与时区转换环节
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











