必须用 asia/shanghai,因其是 iana 时区数据库唯一官方收录并持续维护的中国标准时间标识符;prc 已废弃,china/beijing 不存在,+08:00 是固定偏移,不支持时区规则解析。

PHP 时区设为中国标准时间,必须用 Asia/Shanghai,不能用 PRC、China/Beijing 或 +08:00 这类伪时区或偏移量。
为什么只能用 Asia/Shanghai?
PHP 的时区列表严格遵循 IANA 时区数据库(tzdata),Asia/Shanghai 是唯一被官方收录、持续维护的中国标准时间标识符。而 PRC 虽在旧版 PHP 中曾短暂支持,但自 PHP 5.4 起已被标记为废弃;China/Beijing 根本不存在于 tzdata;+08:00 是固定偏移,不处理夏令时逻辑(虽然中国不实行夏令时,但 PHP 的 DateTime 类内部依赖完整时区规则,硬写偏移会导致 DateTimeZone::getTransitions() 失效、格式化异常等问题。
-
date_default_timezone_set('PRC')在 PHP 8.1+ 会触发E_DEPRECATED警告 -
new DateTime('now', new DateTimeZone('+08:00'))创建的对象,调用$dt->modify('+1 day')后再format('c')可能输出错误时区缩写(如+08而非CST) - 使用
Asia/Shanghai才能正确解析历史时间(例如 1949 年前上海曾用 GMT+8:06,IANA 数据库已收录该变更)
三种设置方式及适用场景
不是所有地方都适合直接调 date_default_timezone_set() —— 它影响全局,且一旦设置无法重置(除非重启请求)。实际项目中应按需选择:
- Web 应用入口(如
index.php开头):用date_default_timezone_set('Asia/Shanghai'),确保整个请求生命周期统一 - CLI 脚本或定时任务:必须显式设置,否则默认是
UTC,容易导致日志时间错乱、数据库写入时间偏差 - 多时区业务(如 SaaS 系统):禁用全局设置,改用
new DateTimeZone('Asia/Shanghai')配合每个DateTime实例,避免用户 A 的时区污染用户 B 的时间计算
验证是否生效的可靠方法
别只看 date('Y-m-d H:i:s') 输出是否“看起来像北京时间”——这可能只是服务器本地时间巧合。真正验证要查时区元数据:
立即学习“PHP免费学习笔记(深入)”;
var_dump(date_default_timezone_get()); // 必须返回 string(13) "Asia/Shanghai"
echo (new DateTimeZone('Asia/Shanghai'))->getOffset(new DateTime()); // 应返回 28800(即 +08:00 秒)
如果 date_default_timezone_get() 返回空字符串或 UTC,说明设置未生效;若 getOffset() 返回 0,大概率是误用了 +08:00 字符串而非时区名。
注意:Asia/Shanghai 不代表“仅限上海”,它覆盖全中国法定时区(GMT+8),但 PHP 不会自动识别地域政策差异(比如新疆部分单位实际用 UTC+6),这类业务层逻辑必须手动处理,不能依赖时区设置。











