java.time.format.DateTimeParseException仅在2位数的毫秒数

时间:2018-04-18 14:21:16

标签: java java-time datetime-parsing java-date

我使用java8 formatter解析日期'2018-04-12 15:12:32.999'。当我有一个3位数的毫秒时,例如这个日期' 2018-04-12 15:12:32.999',它工作正常,但它失败并引发异常java.time.format.DateTimeParseException: Text '2018-04-18 15:27:10.77' could not be parsed at index 20,当日期只有2位数毫秒时,你能建议吗?如何解析这个日期。

我的格式化程序正在使用" yyyy-MM-dd HH:mm:ss.SSS"模式。我的代码是这样的:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
LocalDateTime.parse(dateStr,formatter);

3 个答案:

答案 0 :(得分:1)

有几种选择。我会选择这个:

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral(' ')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .toFormatter();
    String dateTimeString = "2018-04-18 15:27:10.77";
    LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter);
    System.out.println(dateTime);

输出:

  

2018-04-18T15:27:10.770

DateTimeFormatter.ISO_LOCAL_TIME可选择接受小数点和1到9位数。我更喜欢使用构建器来组合预定义的格式化程序,而不是从头开始构建我自己的格式化程序。

有一些更喜欢的短片。就个人而言,我发现它有点hacky:

    dateTimeString = dateTimeString.replace(' ', 'T');
    LocalDateTime dateTime = LocalDateTime.parse(dateTimeString);

输出是一样的。我们正在利用两个事实:(1)one-arg LocalDateTime.parse解析ISO 8601格式。 (2)您的输入字符串非常接近ISO 8601格式,它只缺少表示时间部分开始位置的T

您不需要第三个选项,但为了完整起见,我想提一下:如果从头开始构建格式化程序并需要可变数量的小数,请使用DateTimeFormatterBuilder(我在上面使用的类)第一个片段)和its appendFraction method。它可以控制最小和最大小数位数。

答案 1 :(得分:1)

library(data.table)
mydata <- as.data.table(mydata)
mydata[, Ntile:=ntile(mileage,10), by=year]

其中2,3-字段的最小,最大宽度

输出:

2018-04-12T15:12:32.990

答案 2 :(得分:0)

15:12:32:999包含冒号:。您的模式HH:mm:ss.SSS包含一个点.这将不匹配。

这很有效。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Playground {

    public static void main(String[] args) throws ParseException {
        String pattern = "yyyy-MM-dd HH:mm:ss.SSS";

        String s1 = "2018-04-12 15:12:32.999";
        String s2 = "2018-04-18 15:27:10.77";

        SimpleDateFormat sdf = new SimpleDateFormat(pattern);

        Date d1 = sdf.parse(s1);
        System.out.println(d1);

        Date d2 = sdf.parse(s2);
        System.out.println(d2);
    }

}

输出:

Thu Apr 12 15:12:32 CEST 2018
Wed Apr 18 15:27:10 CEST 2018