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

Java 8 date/time: instant, could not be parsed at index 19

我有以下代码:

1
2
3
4
5
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);

它给了我以下例外:

Exception in thread"main" java.time.format.DateTimeParseException:
Text '2016-09-18T12:17:21:000Z' could not be parsed at index 19 at
java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
at
java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
at java.time.Instant.parse(Instant.java:395) at
core.domain.converters.TestDateTime.main(TestDateTime.java:10)

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

1
String dateInString ="2016-09-18T12:17:21.000Z";

...然后执行顺利:

2016-09-18T15:17:21+03:00[Europe/Kiev]

那么,问题是 - 如何用InstantDateTimeFormatter解析日期?


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

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

1
2
3
4
5
6
7
8
9
10
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);

输出此代码:

1
2016-09-18T12:17:21+03:00[Europe/Kiev]

如果你的datetime文字有一个点而不是最后一个冒号,事情会简单得多。


使用SimpleDateFormat

1
2
3
4
5
String dateInString ="2016-09-18T12:17:21:000Z";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSS");
Instant instant = sdf.parse(dateInString).toInstant();
ZonedDateTime zonedDateTime = instant.atZone(ZoneId.of("Europe/Kiev"));
System.out.println(zonedDateTime);

2016-09-18T19:17:21+03:00[Europe/Kiev]


1
2
3
4
5
6
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/MM/yyyy");

String date ="16/08/2016";

//convert String to LocalDate
LocalDate localDate = LocalDate.parse(date, formatter);

如果String的格式设置为ISO_LOCAL_DATE,则可以直接解析String,无需转换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.mkyong.java8.date;

import java.time.LocalDate;

public class TestNewDate1 {

    public static void main(String[] argv) {

        String date ="2016-08-16";

        //default, ISO_LOCAL_DATE
        LocalDate localDate = LocalDate.parse(date);

        System.out.println(localDate);

    }

}

看看这个网站
网站在这里