php 8.5 必须显式配置 date.timezone = asia/shanghai 才能正确输出中国标准时间;推荐修改 php.ini 全局生效,备用方案为脚本开头调用 date_default_timezone_set('asia/shanghai'),禁用 prc、+08:00、china/beijing 等非法值。

PHP 8.5 默认不设时区,必须显式配置为 Asia/Shanghai 才能正确输出中国标准时间(CST,GMT+8)。用错标识符(如 PRC、+08:00、China/Beijing)会导致警告、格式异常或历史时间解析错误。
推荐方式:修改 php.ini(全局生效)
这是最稳定、最优先采用的方式:
- 运行
php --ini查看当前加载的 php.ini 路径 - 编辑该文件,找到或新增
date.timezone行,设为:date.timezone = Asia/Shanghai - 保存后重启 PHP 服务(如 php-fpm)或 Web 服务器(Nginx/Apache)
- 验证:执行
php -r "echo date_default_timezone_get();",应输出Asia/Shanghai
备用方式:脚本开头调用 date_default_timezone_set()
适用于无法修改 php.ini 的环境(如共享主机),但仅对当前请求有效:
- 在入口文件(如 index.php、api.php)最顶部添加:
date_default_timezone_set('Asia/Shanghai'); - 确保它在任何 time()、date()、new DateTime() 之前执行
- 注意:该设置不可撤销,且影响整个请求中所有日期函数
不推荐方式:ini_set() 或错误时区名
以下做法存在明确风险,应避免:
-
ini_set('date.timezone', 'PRC')—— PHP 8.1+ 已废弃,触发E_DEPRECATED警告 -
date_default_timezone_set('+08:00')—— 不是合法时区名,DateTime 内部逻辑失效,format('c')可能输出+08而非CST -
date_default_timezone_set('China/Beijing')—— IANA 数据库中根本不存在,运行时报错
验证是否真正生效
别只看 date('Y-m-d H:i:s') 输出“像北京时间”——要查元数据:
-
var_dump(date_default_timezone_get());→ 必须返回string(13) "Asia/Shanghai" -
$tz = new DateTimeZone('Asia/Shanghai'); echo $tz->getOffset(new DateTime());→ 应输出28800(即 +8 小时秒数) - 若返回空、UTC 或 0,说明配置未生效或用了非法值
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











