Java LocalDateTime.parse具有毫秒精度,但可选的微秒精度

时间:2019-02-14 01:40:39

标签: java datetime parsing

是否有一种创建LocalDateTime模式的方法,该模式将解析具有至少毫秒精度但可选的微秒精度的日期/时间,即在接下来的毫秒日期/时间中解析正常,但第二个毫秒(毫秒)失败。我认为模式[[“”]“中的可选指示器将允许这项工作:

DateTimeFormatter DATE_TIME_FORMATTER = 
    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS[SSS]");
System.out.println(LocalDateTime.parse("2019-02-14 11:04:52.784", DATE_TIME_FORMATTER));     
System.out.println(LocalDateTime.parse("2019-02-14 11:04:52.784108", DATE_TIME_FORMATTER));

1 个答案:

答案 0 :(得分:2)

提示编号1

    String withMillis = "2019-02-14 11:04:52.784";
    String withMicros = "2019-02-14 11:04:52.784108";

    System.out.println(LocalDateTime.parse(withMillis.replace(' ', 'T')));
    System.out.println(LocalDateTime.parse(withMicros.replace(' ', 'T')));
2019-02-14T11:04:52.784
2019-02-14T11:04:52.784108

当我们用T替换字符串中间的空格时,该字符串符合ISO 8601,LocalDateTime和java.time解析的其他类的标准格式(以及打印)作为默认设置,即没有任何显式格式化程序。因此,这是一个简单的解决方案。

提示编号2

可以使您尝试的工作正常。只有您不能拆分SSSSSS的序列,该序列的中间有一个方括号。

static final DateTimeFormatter DATE_TIME_FORMATTER = 
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.[SSSSSS][SSS]");

然后:

    System.out.println(LocalDateTime.parse(withMillis, DATE_TIME_FORMATTER));     
    System.out.println(LocalDateTime.parse(withMicros, DATE_TIME_FORMATTER));

我可以选择指定6个小数,然后指定3个小数。我们需要那个命令。如果我们放置[SSS][SSSSSS]并尝试解析6个小数,则格式化程序将首先解析3个小数,然后引发异常,因为它无法使用SSSSSS解析其余3个小数。这有点麻烦,因为它也可以接受不带小数点的小数点,而且如果我们给它9个小数点,它可能会发出非常混乱的错误消息(甚至可能给出错误的结果)。

好的解决方案:使用构建器

static final DateTimeFormatter DATE_TIME_FORMATTER = 
        new DateTimeFormatterBuilder().append(DateTimeFormatter.ISO_LOCAL_DATE)
                .appendLiteral(' ')
                .appendPattern("HH:mm:ss")
                .appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true)
                .toFormatter();

在此,我指定了小数点后的最小值1和最大值9。如果愿意,可以指定3和6。当然,它也会接受4或5。

链接: Wikipedia article: ISO 8601