在 Java 8 中解析 ISO 8601 字符串的困难:偏移量中缺少冒号
Java 的日期和时间解析功能可能会令人沮丧,尤其是在处理时ISO 8601 格式的字符串在偏移量中缺少冒号。让我们探索这个问题并使用新的 java.time API 提供解决方案。
问题描述:
尝试解析类似“2018-02-13T10”的日期字符串时:20:12.120 0000" 使用旧版 java.util.Date 类,该过程顺利成功。
Date date = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZZZ") .parse("2018-02-13T10:20:12.120+0000");
但是,当使用 java.time 中较新的 ZonedDateTime 类时,相同的格式会失败。
ZonedDateTime dateTime = ZonedDateTime.parse("2018-02-13T10:20:12.120+0000", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'hh:mm:ss.SSSZZZ"));
解决方案:
问题在于使用了错误的类进行解析。对于仅涉及 UTC 偏移量的情况,您应该使用 OffsetDateTime,而不是代表完整时区的 ZonedDateTime。
OffsetDateTime odt = OffsetDateTime.parse( "2018-02-13T10:20:12.120+0000" , DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSX" ) );
临时错误解决方法:
不幸的是,由于 Java 8 中的错误,您在解析在小时和分钟之间省略冒号的偏移字符串时可能会遇到问题。作为解决方法,您可以执行以下操作之一:
Hack: 替换输入字符串中缺少的冒号。
String input = "2018-02-13T10:20:12.120+0000".replace( "+0000" , "+00:00" );
定义格式模式:构造 DateTimeFormatter 时使用显式格式模式。
String input = "2018-02-13T10:20:12.120+0000" ; DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSX" );
其他注意事项:
如果您需要 UTC 格式的值,请提取 Instant 对象。对于本地化时间,请使用 ZonedDateTime 类应用时区。
结论:
通过了解适当的类并处理错误,您可以有效地解析和操作日期使用 java.time API 采用 ISO 8601 格式。请记住尽可能使用较新的类,以避免遗留的日期格式问题。
以上是为什么当偏移量缺少冒号时,在 Java 8 中解析 ISO 8601 字符串会很困难?的详细内容。更多信息请关注PHP中文网其他相关文章!