【问题标题】:Parse (ss.nnn) second and nanosecond in Java 8在 Java 8 中解析 (ss.nnn) 秒和纳秒
【发布时间】:2017-11-25 16:56:54
【问题描述】:

我正在尝试解析秒和纳秒,即 10.337000,在 Java 8 中,10 是秒,337000 是纳秒。我不知道应该如何将这些值解析为 @ 987654321@.

我试过DateTimeFormatter.ofPattern("ss:nnnnnn"),但没用。

【问题讨论】:

  • A LocalTime 是一天中的时间,这是你想要的吗?午夜过后 10.337 秒?另一方面,如果你有一个持续时间,一个时间量,Duration 类是正确的使用。
  • 我想你的意思是 10 秒和 337000 微秒?一秒钟有 1,000,000,000 纳秒,所以通常用 9 位小数书写

标签: time java-8 java-time localtime


【解决方案1】:

有几个选项。

如果您的时间字符串表示时间量

在一段时间内,可以使用 java.time 中的 Duration 类的时间量(以天、小时、分钟、秒和/或秒为单位):

    String timeString = "10.337000";
    Duration amountOfTime = Duration.parse("PT" + timeString + "S");
    System.out.println("Duration: " + amountOfTime);
    System.out.println("Seconds: " + amountOfTime.getSeconds());
    System.out.println("Nanos: " + amountOfTime.getNano());

打印出来

Duration: PT10.337S
Seconds: 10
Nanos: 337000000

我们得到了 337000000 纳秒。我认为这是正确的,因为一秒钟有 1,000,000,000 纳秒(百万分之一秒称为微秒)。

Duration 类的解析和格式化功能有限。它解析 ISO 8601 格式,类似于 PT10.337000S,所以我只需将正确的字母放在字符串的前面和末尾,它就可以工作了。您会看到 Duration.toString() 也打印出相同的格式(省略多余的 0 位小数)。

如果您的时间字符串表示一天中的某个时间

您要求LocalTimeLocalTime 是一天中的一个小时,所以如果你打算在午夜过后 10.337 秒,这是正确的使用类。一个简单的选择是在一段时间内添加一个字符串以匹配 ISO 8601 格式,而与 UTC 没有偏移,类似于我在这段时间内所做的:

    LocalTime time = LocalTime.parse("00:00:" + timeString);

这给出了LocalTime

00:00:10.337

同样,toString() 只是提供尽可能多的三位小数组,以呈现完整的精度。

您提到使用DateTimeFormatter,您可能想要坚持这个想法。这将允许您在一个地方构建您的格式化程序并在代码中的其他地方使用它,而不必担心预先添加一个字符串。我们需要告诉格式化程序将分钟和小时设置为 0,为此,我们需要通过 DateTimeFormatterBuilder:

    DateTimeFormatter timeParser = new DateTimeFormatterBuilder()
            .appendPattern("s.SSSSSS")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
            .toFormatter();
    LocalTime time = LocalTime.parse(timeString, timeParser);

这给出了与之前完全相同的结果,LocalTime 为 00:00:10.337。

这个 sn-p 中的格式化程序需要精确的 6 位小数秒(因为小数点后有 6 个大写 S)。如果您的小数位数可能不同,您需要查看DateTimeFormatterBuilder.appendFraction 方法。

【讨论】:

    猜你喜欢
    • 2011-05-17
    • 2015-07-20
    • 2019-08-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    相关资源
    最近更新 更多