ThinkPHP 5.0 修改时区需同步配置 PHP 环境(php.ini 中 date.timezone = "Asia/Shanghai" 并重启服务)和应用入口(public/index.php 顶部调用 date_default_timezone_set('Asia/Shanghai')),并确保数据库时区一致,避免模型时间错乱。

ThinkPHP 5.0 默认使用 PHP 的时区设置(即 date.timezone),但框架本身不强制覆盖,因此修改时区需从两个层面入手:PHP 运行环境级和ThinkPHP 应用级。只改其中一处可能无效,建议两者配合。
一、修改 PHP 配置(推荐优先操作)
这是最根本的方式,影响所有时间相关函数(如 `date()`、`time()`、`strtotime()`)以及 TP 内部对时间的解析。- 找到你当前使用的
php.ini文件(可通过phpinfo()页面查看 “Loaded Configuration File” 路径); - 搜索
date.timezone,取消注释并设为所需时区,例如:date.timezone = "Asia/Shanghai"
- 保存后重启 Web 服务器(如 Apache 或 Nginx);
✅ 验证方式:在控制器中执行 echo date('Y-m-d H:i:s');,确认输出为北京时间(东八区)。
二、ThinkPHP 应用层补充设置(可选加固)
TP5.0 本身不提供全局时区配置项,但可在应用初始化阶段手动调用 `date_default_timezone_set()`,确保框架内时间处理一致:- 编辑应用入口文件
public/index.php(或你自定义的入口),在requireThinkPHP 前添加:date_default_timezone_set('Asia/Shanghai');
立即学习“PHP免费学习笔记(深入)”;
⚠️ 注意:该调用必须在任何依赖时间的代码(如日志、缓存、模型自动写入)执行前完成,否则可能被忽略。
三、数据库时间字段注意点
若使用 `autoWrite` 自动写入 `create_time`/`update_time`,且数据库字段类型为 `datetime`,TP 会调用 `date('Y-m-d H:i:s')` —— 它依赖的就是上面设置的时区。 所以只要 PHP 时区正确,`$autoWrite` 和 `Db::raw()` 中的时间表达式(如 `NOW()`)也会自然对齐本地时间。四、避免常见误区
- 不要试图通过 `config()` 设置时区(TP5.0 无 `timezone` 配置项); - 不要在模型中用 `$default` 给时间字段赋 `time()` 或 `date()`,因为它是运行时静态值,无法反映真实时区逻辑; - 使用 `Carbon` 或 `DateTime` 类时,也需确保其构造未显式指定 UTC,否则会与系统时区冲突。修改完成后,date()、now()、模型自动写入、日志时间戳都会统一按东八区显示。



















