You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:01:12