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
相关产品推荐
相关产品推荐

