应修改 phpinfo() 显示的“Loaded Configuration File”路径下的 php.ini,并将 date.timezone 设为 Asia/Shanghai;若存在多处配置需全部清理,且必须重启 Apache;脚本中调用 date_default_timezone_set() 须在任何时间函数前执行。

date.timezone = PRC 在 php.ini 里不生效?检查是否有多处配置
很多用户改完 php.ini 中的 date.timezone = PRC,重启 Apache 后 date_default_timezone_get() 仍返回 Europe/Berlin 或空值。根本原因是 XAMPP 的 PHP 配置可能被多个 php.ini 文件覆盖:主配置(\xampp\php\php.ini)和 Apache 模块加载时读取的额外 ini 文件(如 \xampp\php\php.ini-development 或 \xampp\php\php.ini-production)。更隐蔽的是,XAMPP 控制面板有时会默认加载 development 版本。
实操建议:
- 用
phpinfo()查看 “Loaded Configuration File” 路径,确认你编辑的是真正被加载的那个php.ini - 搜索整个
\xampp\php\目录下所有含date.timezone的行,确保没有其他 ini 文件覆盖了你的设置 - 如果发现
date.timezone出现在php.ini-development里且值为Europe/Berlin,要么删掉它,要么把该文件重命名(如加.bak后缀),避免被自动加载 - 修改后必须重启 Apache —— 仅重启控制面板或刷新页面无效
为什么推荐用 'Asia/Shanghai' 而不是 'PRC'
PRC 是历史遗留写法,PHP 官方文档已不推荐。自 PHP 5.4 起,PRC 被映射为 Asia/Shanghai,但某些旧版本或严格模式下可能触发警告;而 Asia/Shanghai 是 IANA 时区数据库标准标识符,兼容性更稳,且明确指向东八区(UTC+8),不会因系统 locale 差异产生歧义。
常见错误现象:
立即学习“PHP免费学习笔记(深入)”;
- 在 CLI 模式下运行 PHP 脚本时,
PRC可能被忽略,date()返回 UTC 时间 - 部分 Linux 系统未安装完整时区数据,
PRC解析失败,退回到UTC -
phpinfo()显示时区为PRC,但date('e')输出却是UTC—— 这是解析失败的典型表现
所以统一改用 date.timezone = Asia/Shanghai,或脚本中调用 date_default_timezone_set('Asia/Shanghai')。
脚本内设置 date_default_timezone_set() 的执行时机很关键
这个函数必须在任何时间相关函数(如 date()、strtotime()、getdate())调用之前执行,否则 PHP 会沿用当前默认时区(可能是 UTC 或系统默认),后续再设也无效。
使用场景与注意事项:
- 如果是单文件脚本,把
date_default_timezone_set('Asia/Shanghai');放在第一行(<?php后立即执行) - 如果是框架项目(如 Laravel、ThinkPHP),应在入口文件(
index.php)最顶部设置,而不是在控制器或模型里重复设 - 不要在循环或条件分支里动态调用 —— 多次调用不会报错,但第二次起会触发
E_WARNING: date_default_timezone_set(): Timezone ID 'Asia/Shanghai' is already set - 可通过
if (!date_default_timezone_get()) { date_default_timezone_set('Asia/Shanghai'); }做兜底,但不如全局配置可靠
time() 和 date() 显示时间仍差 8 小时?先排除系统时间本身不准
PHP 的 time() 返回的是 Unix timestamp(从 1970-01-01 UTC 开始的秒数),它本身与时区无关。显示偏差 8 小时,99% 是时区问题;但剩下 1%,是服务器系统时间没同步 —— 尤其是 Windows 下 XAMPP 的 Apache 服务常以 SYSTEM 账户运行,可能无法自动校时。
验证与修复步骤:
- 在命令行运行
time(Windows)或date(Linux/macOS),看系统时间是否准确 - Windows 用户可手动右键任务栏时间 → “调整日期/时间” → 开启“自动设置时间”
- 若需命令行强制同步:
w32tm /resync(管理员权限) - Linux 下 XAMPP 若部署在虚拟机中,注意宿主机与客户机时间漂移,建议关闭虚拟机时间同步功能,改用 NTP
真正麻烦的是那种“php.ini 改了、函数也调了、系统时间也准了,但页面偶尔还是跳回 UTC”的情况 —— 很可能某个 include 的第三方库悄悄执行了 date_default_timezone_set('UTC'),得用 grep -r "date_default_timezone_set" . 全局搜一遍。



















