无法使用DateTimeFormatter解析日期

时间:2018-05-16 07:43:52

标签: java-8

我正在尝试使用DateTimeFormatter解析从DB返回给LocalDate的日期字符串。我收到以下例外情况。

String date = "2018-05-16 03:39:13.0";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
LocalDateTime localDate= LocalDateTime.parse(date , formatter);
java.time.format.DateTimeParseException: Text '2018-05-16 03:39:13.0' could not be parsed at index 20
        at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) [rt.jar:1.8.0_171]
        at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) [rt.jar:1.8.0_171]
        at java.time.LocalDateTime.parse(LocalDateTime.java:492) [rt.jar:1.8.0_171]

但是下面的代码正在运行。

String date = "2018-05-16 03:39:13.0";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date newDate= formatter.parse(date);

3 个答案:

答案 0 :(得分:2)

由于您使用固定长度为3的秒数,因此无法仅使用一位数进行解析。更好地使用DateTimeFormatterBuilder并实现变量小数秒。

String date = "2018-05-16 03:39:13.0";

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
DateTimeFormatter formatter = builder.appendPattern("yyyy-MM-dd HH:mm:ss")
    .appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true)
    .toFormatter();

LocalDateTime localDate = LocalDateTime.parse(date, formatter);
System.out.println(formatter.format(localDate));

也可以通过使用可选字段来获得可变的小数秒长度:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss[.SSS][.SS][.S]");

答案 1 :(得分:0)

如果您的意图只是解析StringLocalDateTime,这样可以正常使用。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");

答案 2 :(得分:-1)

这可能会成功。

toString()