为何PHP自7.0.26版本起无法解析BRST格式日期?
解决PHP 7.0.26+中BRST时区解析失败的问题
首先得说清楚,这个问题的根源是PHP依赖的时区数据库(tzdata)版本更新——BRST(巴西利亚夏令时)这个时区缩写在新版tzdata里被移除了,而PHP 7.0.26刚好同步了这次更新,所以之前能跑的代码突然就报错了。
为什么旧版本没问题,新版本就报错?
在早期的tzdata规范里,BRST是作为巴西利亚夏令时的非标准别名存在的,但后来时区数据库做了标准化调整,统一使用America/Sao_Paulo作为巴西圣保罗(包含巴西利亚地区)的官方时区标识符,同时移除了BRST这类不规范的缩写。PHP从7.0.26版本开始升级了内置的tzdata,自然就不再识别这个旧缩写了。
两种可行的修复方案
直接替换为标准时区标识符
把字符串里的BRST换成America/Sao_Paulo,修改后的代码如下:$date = DateTime("Mon Jan 01 20:00:00 America/Sao_Paulo 2017");这个标准标识符会自动处理夏令时和冬令时的切换逻辑,比用缩写更稳定可靠。
拆分字符串单独指定时区
如果没法修改原始的日期字符串,可以先提取不含时区的日期部分,再手动指定时区解析:$dateStr = "Mon Jan 01 20:00:00 BRST 2017"; // 截取掉末尾的"BRST 2017"部分,保留前面的日期时间 $datePart = substr($dateStr, 0, strlen($dateStr) - 8); $date = DateTime::createFromFormat("D M d H:i:s Y", $datePart, new DateTimeZone("America/Sao_Paulo"));
补充说明
用America/Sao_Paulo替代BRST后,不仅能在PHP 7.0.26+正常运行,还能兼容更低版本的PHP,是更通用的写法。
内容的提问来源于stack exchange,提问作者hugofcampos
相关产品推荐
相关产品推荐

