
在使用 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');
my.cnf 中额外配置:[mysqld]
default-time-zone = '+8:00'