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

Dart中DateFormat解析非标准时区日期字符串报错及解决

Dart DateFormat解析日期字符串失败问题排查

尝试用Dart的DateFormat解析日期字符串时,第二个格式无法正常运行。

示例代码:

DateTime parsedDate1 = DateFormat("yyyy-MM-dd HH:mm:ss z").parse("2023-10-20 08:29:46 GMT+02:00");
print(parsedDate1);

DateTime parsedDate2 = DateFormat("EEE MMM dd HH:mm:ss 'GMT'z yyyy").parse("Wed Oct 25 14:32:49 GMT+02:00 2023");
print(parsedDate2);

运行后抛出异常:

FormatException: Trying to read from Wed Oct 25 14:32:49 GMT+02:00 2023 at 24

调试环境为DartPad,以下是问题原因和解决方法:

问题根源

格式串里的时区部分写法错误:你在第二个格式串中写了'GMT'z,但Dart的DateFormat中,z标识符本身就可以匹配GMT+02:00这种完整的时区格式(包含GMT前缀和偏移)。当你额外加上'GMT'固定字符串时,解析器会先匹配GMT,然后让z去匹配剩下的+02:00,但z无法单独识别不带GMT前缀的偏移值,因此匹配失败,抛出异常。

解决方法

有两种直接修改格式串的方案:

  • 方案一:去掉多余的'GMT',用z匹配完整时区
    修改格式串为EEE MMM dd HH:mm:ss z yyyy,让z完整匹配GMT+02:00,后续yyyy匹配末尾年份:

    DateTime parsedDate2 = DateFormat("EEE MMM dd HH:mm:ss z yyyy").parse("Wed Oct 25 14:32:49 GMT+02:00 2023");
    
  • 方案二:用ZZ匹配带冒号的时区偏移
    如果你想保留'GMT'的写法,可以用ZZ专门匹配+02:00这种带冒号的偏移,格式串改为EEE MMM dd HH:mm:ss 'GMT'ZZ yyyy:

    DateTime parsedDate2 = DateFormat("EEE MMM dd HH:mm:ss 'GMT'ZZ yyyy").parse("Wed Oct 25 14:32:49 GMT+02:00 2023");
    

你提到的预处理字符串调整年份和时区位置的方法也可行,但上述两种修改格式串的方式更直接高效。

内容的提问来源于stack exchange,提问作者Tim Vereecken

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:43:16