首页 > 解决方案 > 无法使用 DateTimeFormatter 解析日期

问题描述

我正在尝试使用 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);

标签: java-8

解决方案


由于您使用的是固定长度为 3 的小数秒,因此不能仅用一位数字进行解析。更好地使用 aDateTimeFormatterBuilder并实现可变的秒数。

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]");

推荐阅读