+-
java解析“2021-05-19T17:10:56.272587046+08:00”到Date的format怎么写?

收到字符串是2021-05-19T17:10:56.272587046+08:00,要解析到Date,请问format怎么写

知道 Java8 对日期时间的处理做了不少功课,但是还是没想到,要把 RFC3339 格式的字符串解析成日期时间对象还是这么难……

参考了 StackOverflow 上的回答
import java.time.*; import java.time.format.*; import static java.time.format.DateTimeFormatter.*; public class Test { public static void main(String[] args) { String s = "2021-05-19T17:10:56.272587046+08:00"; DateTimeFormatter formatter = new DateTimeFormatterBuilder() .append(ISO_LOCAL_DATE_TIME) .optionalStart() .appendOffset("+HH:MM", "Z") .optionalEnd() .toFormatter(); ZonedDateTime dt = ZonedDateTime.parse(s, formatter); System.out.println(dt.toInstant()); } }

之所以去 StackOverflow 上去找答案,是因为尝试了一下,用 Instant.parse() 抛异常,Instnat.parse() 可以解析以 Z 结尾的 RFC3339 时间串,但不能解析带时区的……

不过在 StackOverflow 上找到答案之后,觉得我不应该用 Instant,而应该用 ZonedDateTime,所以又尝试了一下

import java.time.*; public class Test { public static void main(String[] args) { String s = "2021-05-19T17:10:56.272587046+08:00"; String s1 = "2021-05-19T17:10:56.272587046Z"; System.out.println(ZonedDateTime.parse(s).toInstant()); System.out.println(ZonedDateTime.parse(s1).toInstant()); } } // 2021-05-19T09:10:56.272587046Z // 2021-05-19T17:10:56.272587046Z

看来用 ZonedDateTime 是对了,UTC 和带时区的都能解析。

得补充一下,使用的是 JDK 11。至于 JDK 8,没试过,不知道会不会有问题。