有多种选择。这里是一个简单的例子:
private static DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS[XXX]")
.withZone(ZoneOffset.UTC);
public static Instant parse(String offsetDateTimeString) {
return OffsetDateTime.parse(offsetDateTimeString, formatter).toInstant();
}
让我们试试看:
System.out.println(parse("2018-08-04T21:41:55.987Z"));
System.out.println(parse("2018-08-04T19:41:55.987-02:00"));
System.out.println(parse("2018-08-04T21:41:55.987"));
印刷品:
2018-08-04T21:41:55.987Z
2018-08-04T21:41:55.987Z
2018-08-04T21:41:55.987Z
X
使用
Z
对于偏移零,所以匹配三种格式中的前两种。要指定字符串中没有任何字符时要使用的偏移量,我在格式化程序上设置了默认的时区UTC。
变化包括:
-
您可以使用预定义的ISO格式,而不是自己编写整个格式模式字符串。
-
由于我们是在偏移量之后,而不是在时区之后,因此指定默认偏移量而不是默认时区可能更为正确。
DateTimeFormatterBuilder
让我们两者兼得。因此,在这里,您可以在上述代码中使用不同的格式化程序:
private static DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.appendPattern("[XXX]")
.parseDefaulting(ChronoField.OFFSET_SECONDS, ZoneOffset.UTC.getTotalSeconds())
.toFormatter();
结果是相同的。