Java 8日期/时间:即时,无法在索引19处解析

Gre*_*oot 4 java time parsing date java.time.instant

我有以下代码:

String dateInString = "2016-09-18T12:17:21:000Z";
Instant instant = Instant.parse(dateInString);

ZonedDateTime zonedDateTime = instant.atZone(ZoneId.of("Europe/Kiev"));
System.out.println(zonedDateTime);
Run Code Online (Sandbox Code Playgroud)

它给了我以下异常:

线程“主”中的异常java.time.format.DateTimeParseException:无法在java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:的索引19处解析文本'2016-09-18T12:17:21:000Z' 1949)在java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)在java.time.Instant.parse(Instant.java:395)在core.domain.converters.TestDateTime.main(TestDateTime.java:10 )

当我将最后一个冒号更改为句号时:

String dateInString = "2016-09-18T12:17:21.000Z";
Run Code Online (Sandbox Code Playgroud)

…然后执行正常:

2016-09-18T15:17:21 + 03:00 [欧洲/基辅]

因此,问题是-如何使用Instant和解析日期DateTimeFormatter

Boh*_*ian 6

“问题”是毫秒之前的冒号,这是非标准的(标准是小数点)。

要使其工作,必须DateTimeFormatter为您的自定义格式构建一个自定义:

String dateInString = "2016-09-18T12:17:21:000Z";
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
    .append(DateTimeFormatter.ISO_DATE_TIME)
    .appendLiteral(':')
    .appendFraction(ChronoField.MILLI_OF_SECOND, 3, 3, false)
    .appendLiteral('Z')
    .toFormatter();
LocalDateTime instant = LocalDateTime.parse(dateInString, formatter);
ZonedDateTime zonedDateTime = instant.atZone(ZoneId.of("Europe/Kiev"));
System.out.println(zonedDateTime);
Run Code Online (Sandbox Code Playgroud)

此代码的输出:

2016-09-18T12:17:21+03:00[Europe/Kiev]
Run Code Online (Sandbox Code Playgroud)

如果您的日期时间文字有一个点而不是最后一个冒号,那么事情会简单得多。