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

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格式化规则的实现差异:

  1. OOOO格式符的定义差异:
    • 标准JDK(IntelliJ使用的环境)中,OOOO支持解析带GMT前缀的时区偏移(如GMT+10:00),它属于本地化的时区偏移格式,兼容带前缀的写法。
    • Android平台(尤其是API 26之前依赖ThreeTenABP实现java.time的版本)对OOOO的解析规则更严格:它仅匹配不带GMT前缀的纯偏移格式(如+10:00),无法识别输入字符串中的GMT+10:00,因此抛出解析异常。
  2. zzzz格式符的适配性:
    zzzz代表的是长格式时区标识,既可以解析如Australia/Sydney这类时区名,也支持GMT+10:00这种带前缀的偏移格式,刚好匹配输入字符串,因此在Android中可以正常解析。

内容的提问来源于stack exchange,提问作者Кирилл Протченко

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:50:25