CLI时间错误源于PHP CLI环境未读取网页配置,其时区常为UTC而非Asia/Shanghai,需通过php -r "echo date_default_timezone_get();"验证,并检查CLI专属php.ini中date.timezone设置,必要时在入口脚本顶部硬编码date_default_timezone_set('Asia/Shanghai')。

CLI模式下时间戳显示错误,不是框架写错了,而是PHP CLI环境根本没读你的网页配置。网页访问看着正常,但php artisan schedule:run或php think timer:run跑出的日志时间差8小时——这说明CLI用的是系统默认时区(通常是UTC),和Web请求走的不是同一套设置路径。
确认CLI当前实际时区
别猜,直接查:
- 运行命令:
php -r "echo date_default_timezone_get();" - 如果输出是
UTC或空字符串,就证实了问题根源 - 再执行
php -i | grep "date.timezone",看php.ini里是否真设置了date.timezone = "Asia/Shanghai"——注意CLI用的是独立的php.ini,路径可能和Web不同(常见于/etc/php/*/cli/php.ini)
强制CLI入口统一时区
即使php.ini已设,CLI仍可能因加载顺序或SAPI差异跳过。最稳妥方式是在脚本最顶端硬编码:
- 打开
yii命令行入口文件(通常是项目根目录下的yii或console/yii) - 在
<?php之后第一行插入:date_default_timezone_set('Asia/Shanghai'); - 确保它出现在
require __DIR__ . '/vendor/autoload.php';之前
检查Yii2控制台应用配置
Yii2控制台应用(console/config/main.php)中必须显式声明时区:
- 确认存在
'timeZone' => 'Asia/Shanghai'配置项 - 同时检查
'formatter' => ['timeZone' => 'Asia/Shanghai']是否同步设置——否则$formatter->asDatetime()等方法仍会按UTC格式化 - 若使用数据库自动时间戳(如
created_at),还要确认MySQL连接层没覆盖时区:在DB组件配置中加'initSqls' => ["SET time_zone = '+08:00'"]
验证修复是否生效
改完别急着上线,立刻验证:
- 运行
php yii help,观察命令输出里的时间是否为北京时间 - 写个简单命令:
php yii test/time,内容为var_dump(date('Y-m-d H:i:s'));,看输出是否准确 - 触发一次定时任务:
php yii schedule/run,检查生成日志的时间字段


















