+-
收到字符串是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,没试过,不知道会不会有问题。