php 8.6 中必须使用 asia/shanghai 设置中国标准时间,禁用 prc、+08:00 等非标准写法;推荐在入口文件首行调用 date_default_timezone_set('asia/shanghai'),cli 脚本需显式设置,验证须用 date_default_timezone_get() 和 getoffset()。

PHP 8.6 中设置时区为中国标准时间(即东八区),必须使用 Asia/Shanghai,不能用 PRC、+08:00、China/Beijing 等非标准写法。这是 IANA 时区数据库的强制要求,PHP 8.6 沿续了这一规范,且对废弃时区标识(如 PRC)会触发 E_DEPRECATED 警告甚至报错。
推荐方式:在入口文件统一设置
适用于 Web 应用(如 Laravel、ThinkPHP、自建框架等):
- 在
public/index.php或项目启动入口最顶部添加:
date_default_timezone_set('Asia/Shanghai');
- 确保它出现在任何时间函数(
date()、new DateTime())调用之前 - 该设置作用于整个请求生命周期,无需重复调用
- 比修改 php.ini 更灵活,便于环境迁移和多项目共存
备选方式:修改 php.ini(需重启服务)
如果你有服务器权限且希望全局生效:
- 找到 php.ini 文件路径(运行
php --ini或phpinfo()查看) - 编辑配置项:
date.timezone = Asia/Shanghai(注意不带引号,大小写敏感) - 保存后重启 PHP-FPM 或 Web 服务器(如 Nginx/Apache)
- CLI 环境下也需确认该配置已加载(
php -i | grep timezone)
验证是否设置成功
仅看 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(即 +08:00 秒) - 若返回空、UTC 或 0,说明设置未生效或误用了
'+08:00'
特别注意 CLI 和定时任务
命令行脚本默认不继承 Web 环境的 php.ini 设置,容易沿用 UTC:
- 所有 CLI 脚本(如 Artisan 命令、Cron 定时任务)必须显式调用
date_default_timezone_set('Asia/Shanghai') - 不要依赖
ini_set('date.timezone', ...),它在部分 SAPI 下可能无效 - 避免用
new DateTimeZone('+08:00')创建对象——它不是完整时区,会导致format('c')输出错误缩写、getTransitions()失效等问题
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











