解决 1Panel PHP 容器时间 UTC 偏差8小时问题

解决 1Panel PHP 容器时间 UTC 偏差8小时问题
在使用 1Panel 面板管理 PHP 容器时,即使将 Debian 服务器和容器的环境变量 TZ=Asia/Shanghai 都设置为北京时间,网站通过 date() 函数获取的时间仍然是 UTC,比北京时间慢8小时。
原因分析
容器的环境变量 TZ 只影响系统层面的时区,并不会自动同步到 PHP 的运行配置。PHP 有自己独立的时区设置,由 php.ini 中的 date.timezone 控制,两者互相独立。
时间经过三个层级,任意一层没有正确配置都会导致时间偏差:
系统时区(TZ环境变量)→ PHP时区(php.ini)→ 数据库时区
排查方法
在网站目录新建 test.php,访问即可定位是哪一层出了问题:
<?php
echo date_default_timezone_get(); // 显示当前PHP时区
echo '<br>';
echo date('Y-m-d H:i:s'); // 显示当前PHP时间
如果输出 UTC,说明是 php.ini 未配置或未生效。
解决步骤
第一步,进入 PHP 容器,确认 php.ini 路径:
docker exec -it php8 bash
php -i | grep "Loaded Configuration File"
# 输出:/usr/local/etc/php/php.ini
第二步,追加时区配置:
echo "date.timezone = Asia/Shanghai" >> /usr/local/etc/php/php.ini
第三步,确认写入成功:
grep "timezone" /usr/local/etc/php/php.ini
# 应看到:date.timezone = Asia/Shanghai
第四步,退出容器并重启:
exit
docker restart php8
第五步,再次访问 test.php,确认输出 Asia/Shanghai 和正确的北京时间。
注意事项
- 容器重建后,手动写入
php.ini的内容会丢失,建议在 1Panel 中通过挂载配置文件的方式持久化,或在代码入口文件顶部添加以下代码作为保险:
date_default_timezone_set('Asia/Shanghai');
- 如果项目使用了数据库,MySQL 同样有独立的时区设置,需要在
my.cnf中额外配置:
[mysqld]
default-time-zone = '+8:00' 相关文档
评论与补充0
有问题或想补充的,写在下面 · 选中正文文字再点「报告错误」会自动引用还没有评论。有疑问、补充,或者发现错字,都可以写在下面。