tp6默认不设时区,依赖php配置的date.timezone,若为空或为utc会导致date()、日志、now()等时间偏差1–8小时;推荐在.env设app_timezone、代码中调用date_default_timezone_set()或修改php.ini三者组合使用,并分别验证web与cli环境。

TP6 安装完成后不配时区,date()、日志时间、数据库写入的 NOW() 都可能错 1–8 小时,不是“看起来不对”,而是真实时间偏差 —— 这问题不会报错,但会埋进日志、缓存键、token 过期逻辑里,后期极难排查。
为什么 TP6 默认不处理时区
ThinkPHP 6.0 不主动设置 PHP 时区(即不调用 date_default_timezone_set()),它完全依赖 PHP 配置中的 date.timezone。而多数系统默认值是空或 UTC,尤其 Docker、云主机、Mac Homebrew PHP 常见此情况。
- 运行
php --ini查配置文件路径,再打开php.ini搜索date.timezone - 若该行被注释(
;date.timezone =)或值为空,PHP 就用 UTC - TP6 的
App类初始化时不会覆盖这个底层设定
三种生效且互不冲突的设时区方式
优先级从高到低:应用层 > 框架配置 > PHP 配置。推荐组合使用,避免单点失效。
- 在
.env文件中加一行:APP_TIMEZONE=Asia/Shanghai(TP6 原生支持,会自动触发date_default_timezone_set()) - 在
app/common.php或public/index.php开头手动加:date_default_timezone_set('Asia/Shanghai');(最直接,绕过任何框架逻辑) - 修改
php.ini中的date.timezone = Asia/Shanghai并重启 PHP-FPM/Apache(全局生效,但需运维权限,Docker 环境常必须这么做)
验证时区是否真正生效
别只看 phpinfo() 里的显示,要测实际行为:
- 在控制器里写:
dump(date('Y-m-d H:i:s'), date_default_timezone_get());—— 两个输出必须一致且符合本地时间 - 查 runtime/log/ 下最新日志文件名,比如
20260922.log,再打开看首条日志的时间戳是否是你当前北京时间 - 执行
php think version后立刻运行date命令对比秒级差异;若有偏差,说明 CLI 和 Web SAPI 时区不一致(常见于 CLI 用系统 php.ini,Web 用另一份)
最容易被忽略的是 CLI 和 Web 环境时区分离 —— .env 对 CLI 有效,但 Apache/Nginx 下的 PHP 可能压根没加载它;php.ini 改了,却忘了重启 php-fpm。一个项目里同时跑命令行任务和 Web 请求时,这点必须双端确认。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











