PHP时区设置必须使用IANA官方标准标识符(如Asia/Shanghai),禁用缩写、偏移量或自定义字符串;错误写法会触发Unknown or bad timezone错误,且大小写与斜杠须严格匹配。

PHP 时区设置必须用标准时区标识符(如 Asia/Shanghai),不能用缩写(如 CST)、偏移量(如 +08:00)或自定义字符串。
时区标识符不是任意填的,PHP 只认 IANA 官方数据库里的名字
PHP 的 date_default_timezone_set() 和 DateTimeZone 构造函数只接受 IANA 时区数据库中的有效标识符。填错会直接报 DateTimeZone::__construct(): Unknown or bad timezone 错误。
-
Asia/Shanghai✅ 正确(中国大陆标准时间) -
PRC⚠️ 历史遗留别名,PHP 7.0+ 已弃用,不推荐 -
CST❌ 错误(CST 有多个含义:美国中部、中国标准、澳大利亚中部) -
+08:00❌ 错误(这是 UTC 偏移,不是时区标识符) -
China/Beijing❌ 错误(IANA 中不存在该路径)
如何查到合法且稳定的时区名
别靠记忆或搜索引擎拼凑,用 PHP 自带工具最可靠:
- 运行
php -r "print_r(DateTimeZone::listIdentifiers());"查全部(约 400+ 个) - 按地区筛选更实用:
DateTimeZone::listIdentifiers(DateTimeZone::ASIA) - 常见中国大陆相关:
Asia/Shanghai(覆盖全境,含港澳台实际也常用)、Asia/Urumqi(新疆等地有时用于本地视图,但非官方时区) - 注意:没有
Asia/Beijing或Asia/Hong_Kong是独立条目(Asia/Hong_Kong✅ 存在;Asia/Macau✅ 存在)
ini 设置和代码设置混用时的优先级陷阱
date.timezone 在 php.ini 里设了,不代表代码里调 date_default_timezone_set() 就无效——后者会覆盖前者,且影响所有后续 date()、strtotime() 等行为。
立即学习“PHP免费学习笔记(深入)”;
- 如果框架(如 Laravel)或 Composer 包内部调用了
date_default_timezone_set(),你的php.ini设置可能被静默覆盖 -
ini_set('date.timezone', '...')是运行时修改,效果同date_default_timezone_set(),但不如后者语义清晰 - CLI 和 Web SAPI 的
php.ini可能不同,用phpinfo()或ini_get('date.timezone')实际确认当前生效值
时区名大小写和路径分隔符必须严格匹配
IANA 标识符是大小写敏感的,且必须用正斜杠 / 分隔,不能用反斜杠或下划线。
-
asia/shanghai❌ 全小写错误 -
Asia\Shanghai❌ Windows 风格反斜杠 -
Asia_Shanghai❌ 下划线非法 -
Asia/Shanghai✅ 唯一正确写法 - 注意:有些旧文档写成
Asia/Chongqing,它在 PHP 中存在但已软废弃,建议统一用Asia/Shanghai
真正容易被忽略的是:同一个地理区域可能有多个时区名(比如 Asia/Shanghai 和 Asia/Chongqing 指向同一历史规则),但 PHP 不保证它们长期等价;生产环境务必锁定一个明确、主流、无歧义的标识符,而不是依赖别名或模糊匹配。











