PHP时间显示偏差主因是时区未对齐,须确保PHP、系统、MySQL三者时区一致:修改php.ini中date.timezone = Asia/Shanghai,重启服务后用date_default_timezone_get()和date()验证;MySQL需设default-time-zone = '+08:00';代码中DateTime构造须显式传时区。

PHP时间显示偏差,八成是时区没对齐。核心不是“设没设”,而是“设对没、生效没、上下游配没”。关键要让 PHP、系统、MySQL 三者在时间理解上达成一致,而不是各自为政。
确认并修正 PHP 主配置
改 php.ini 是最稳妥的全局方案,但必须做对三件事:
- 用 phpinfo() 查清 Loaded Configuration File 的真实路径,别凭感觉改错文件
- 找到或新增 date.timezone = Asia/Shanghai(不加引号、大小写严格、不用 PRC 或 GMT+8)
- 改完后,分别重启 Web 服务和 PHP 进程:Apache 用
sudo systemctl restart apache2,php-fpm 则需匹配版本,如sudo systemctl restart php8.2-fpm
验证是否真正生效
别只看 phpinfo(),运行这行代码才是最终答案:
var_dump(date_default_timezone_get(), date('Y-m-d H:i:s'));
输出应同时满足:
— 第一个值是 string(13) "Asia/Shanghai"
— 第二个值是当前准确的北京时间(非 UTC 时间)
若不满足,说明配置未加载,常见于 CLI 和 Web 环境使用了不同 php.ini,或被 Docker 中的环境变量覆盖。
同步 MySQL 时区,避免写入错乱
PHP 改了时区,MySQL 还按自己的节奏走,结果就是:PHP 显示对了,数据库存错了。
- 进 MySQL 执行:SELECT @@global.time_zone, @@session.time_zone;,确认不是 SYSTEM(它可能指向 UTC)
- 推荐在 my.cnf 中设置:default-time-zone = '+08:00',然后重启 MySQL
- 不建议在 PHP 每次连接后执行
SET time_zone = '+08:00',连接池复用时容易失效 - 存储层优先用 int 类型存 time(),天然规避所有时区格式化问题
代码层兜底与防踩坑
即使配置正确,代码写法不对仍会翻车:
- DateTime 构造时务必显式传时区:new DateTime($str, new DateTimeZone('Asia/Shanghai')),而非依赖默认
- ThinkPHP 的
default_timezone配置不改变 PHP 全局时区,仍需调用 date_default_timezone_set() - 避免在中间件、模型、循环中重复设置时区,只在应用启动最早期设一次
- 从数据库读 datetime 字段后,不要直接
new DateTime($val),应先明确其原始时区含义
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











