【问题标题】:Parse nano seconds with less than 6 digits解析小于 6 位的纳秒
【发布时间】:2017-07-25 23:24:44
【问题描述】:

我有时间戳2017-07-25 16:19:59.89384

我想解析它:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
LocalDate time = LocalDateTime.parse(timeStamp, formatter);

但我得到了DateTimeParseException,因为纳秒只有 5 位数。有比在右边填充0 更清洁的解决方案吗?

【问题讨论】:

  • 假设这个post 可能对您找到显示纳秒的格式化程序有所帮​​助。
  • 我相信一个选项是timeStamp = timeStamp.replace(' ', 'T');,然后使用单参数LocalDateTime.parse(CharSequence)。我个人更喜欢Hugo’s solution,但这在很大程度上取决于口味。

标签: java java-time datetime-parsing


【解决方案1】:

如果输入 always 有 5 个以纳秒为单位的数字,您可以使用五个 S 字母而不是六个:

String timeStamp = "2017-07-25 16:19:59.89384";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSS"); // five "S"
LocalDateTime datetime = LocalDateTime.parse(timeStamp, formatter);

另请注意,LocalDateTime.parse 返回 LocalDateTime(而不是您的代码中的 LocalDate)。


如果您不知道输入中有多少位数,您可以使用 java.time.format.DateTimeFormatterBuilderjava.time.temporal.ChronoField 并定义最小和最大位数:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
    // date / time
    .appendPattern("yyyy-MM-dd HH:mm:ss")
    // nanoseconds, with minimum 1 and maximum 9 digits and a decimal point
    .appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true)
    // create formatter
    .toFormatter();
LocalDateTime datetime = LocalDateTime.parse(timeStamp, formatter);

您只需要根据需要调整值 1 和 9。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2019-08-01
    • 2015-07-20
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多