Android Studio中String转ZonedDateTime异常原因咨询
为何
OOOO时区格式在Android中解析失败,换成zzzz即可正常运行? 问题背景
已解决问题,但需明确原因:将格式为"dd-MM-yyyy HH:mm:ss:SSSS OOOO"的带时区时间字符串转为ZonedDateTime,再转成"dd-MM-yyyy HH:mm"格式字符串。该代码在IntelliJ IDEA中运行正常,但在Android Studio中抛出DateTimeParseException,将格式改为"dd-MM-yyyy HH:mm:ss:SSSS zzzz"后问题解决。
Android中报错代码
ZonedDateTime zonedDateTime = ZonedDateTime.parse( "22-12-2022 15:05:49:1200 GMT+10:00", DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss:SSSS OOOO") );
报错信息
2022-12-23 12:18:13.558 24464-24464/com.example.sendmessages E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.sendmessages, PID: 24464 java.time.format.DateTimeParseException: Text '22-12-2022 15:05:49:1200 GMT+10:00' could not be parsed: length=34; index=34 at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920) at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855) at java.time.ZonedDateTime.parse(ZonedDateTime.java:591) at com.example.sendmessages.Mapping.MessageMapper.getEntityToDto(MessageMapper.java:18)
IntelliJ IDEA中正常运行的代码
ZonedDateTime zonedDateTime = ZonedDateTime.parse( "22-12-2022 15:05:49:1200 GMT+10:00", DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss:SSSS OOOO") ); System.out.print(dateTimeFormatter.format(zonedDateTime)); // 输出:22-12-2022 15:05
解决方法代码
ZonedDateTime zonedDateTime = ZonedDateTime.parse( "22-12-2022 15:05:49:1200 GMT+10:00", DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss:SSSS zzzz") ); // 输出:22-12-2022 15:05
差异原因解析
核心原因是标准JDK与Android平台对java.time格式化规则的实现差异:
OOOO格式符的定义差异:- 标准JDK(IntelliJ使用的环境)中,
OOOO支持解析带GMT前缀的时区偏移(如GMT+10:00),它属于本地化的时区偏移格式,兼容带前缀的写法。 - Android平台(尤其是API 26之前依赖ThreeTenABP实现
java.time的版本)对OOOO的解析规则更严格:它仅匹配不带GMT前缀的纯偏移格式(如+10:00),无法识别输入字符串中的GMT+10:00,因此抛出解析异常。
- 标准JDK(IntelliJ使用的环境)中,
zzzz格式符的适配性:zzzz代表的是长格式时区标识,既可以解析如Australia/Sydney这类时区名,也支持GMT+10:00这种带前缀的偏移格式,刚好匹配输入字符串,因此在Android中可以正常解析。
内容的提问来源于stack exchange,提问作者Кирилл Протченко
相关产品推荐
相关产品推荐

