PHP报错:DateTimeZone::__construct(): 未知或无效时区(LHDT)求助
解决PHP 7.0.30中LHDT时区识别失败的问题
我之前也碰到过类似的时区缩写兼容问题,尤其是在老版本PHP上,咱们一步步来拆解解决:
问题根源
LHDT是Lord Howe Island Time的时区缩写,但PHP对时区缩写的支持并不是跨版本通用的——你的本地环境大概率是较新的PHP版本,附带的时区数据库(tzdata)已经包含了这个缩写的映射;而生产环境的PHP 7.0.30版本比较老旧,其内置的时区数据库还没有收录LHDT这个缩写,所以会抛出Unknown or bad timezone错误。
解决方案
1. 替换为标准时区标识符(推荐)
PHP官方推荐使用区域/城市格式的标准时区标识符,这种格式在所有支持时区功能的PHP版本中都能稳定识别。LHDT对应的标准标识符是Australia/Lord_Howe,把代码改成:
new DateTimeZone("Australia/Lord_Howe")
这个方案最可靠,完全避免了版本兼容问题。
2. 验证生产环境的时区支持
如果想确认生产环境支持的时区列表,可以在服务器上执行以下代码:
// 查看所有标准时区标识符 print_r(DateTimeZone::listIdentifiers()); // 查看所有支持的时区缩写 print_r(DateTimeZone::listAbbreviations());
执行后你会发现,PHP 7.0.30的缩写列表里确实没有LHDT,但Australia/Lord_Howe肯定在标准标识符列表中。
3. 备选:手动添加时区映射(不推荐)
如果业务上必须使用LHDT这个缩写,可以手动在代码中添加映射逻辑,但这种方法维护成本高,不建议长期使用:
$timezone = "LHDT"; try { $dtz = new DateTimeZone($timezone); } catch (Exception $e) { // 当识别失败时,替换为标准时区 $dtz = new DateTimeZone("Australia/Lord_Howe"); }
总结
优先使用标准时区标识符是避免这类跨版本兼容问题的最佳实践,毕竟缩写可能会随着时区规则更新而变化,而区域格式的标识符是长期稳定的。
内容的提问来源于stack exchange,提问作者CNV
相关产品推荐
相关产品推荐

