如何在java中解析具有两到三毫秒数字的日期时间?

这是我将字符串解析为.LocalDateTime

    public static String formatDate(final String date) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS");
        LocalDateTime formatDateTime = LocalDateTime.parse(date, formatter);
        return formatDateTime.atZone(ZoneId.of("UTC")).toOffsetDateTime().toString();
    }

但这仅适用于输入字符串,如,但对于 .2017-11-21 18:11:14.052017-11-21 18:11:14.057DateTimeParseException

如何定义同时适用于 和 的格式化程序?.SS.SSS


答案 1

您需要构建具有指定分数的格式化程序

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

LocalDateTime formatDateTime = LocalDateTime.parse(date, formatter);

答案 2

Basil BourqueSleiman Jneidi的答案非常好。我只是想指出,EMH333的答案也有一点:以下非常简单的修改问题中的代码可以解决您的问题。

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

格式模式字符串中的方括号将可选部分括起来,因此它接受秒的小数部分为 3 或 2 位小数。

  • 与Basil Bourque的答案相比的潜在优势:提供更好的输入验证,如果秒数只有1或有四个小数,则会反对(这是否是优势完全取决于您的情况)。
  • 比Sleiman Jneidi的答案更有优势:你不需要建造者。

可能的缺点:它根本不接受小数(只要小数点在那里)。

正如我所说,其他解决方案也非常好。你喜欢哪一个主要是品味问题。