在Java 8中解析(ss.nnn)秒和纳秒

时间:2017-11-25 16:56:55

标签: time java-8 java-time localtime

我正在尝试解析秒和纳秒,即 10.337000 ,其中10是秒,在Java 8中是337000是纳秒。我无法弄清楚如何将这些值解析为{ {1}}。

我尝试了LocalTime,但它没有用。

1 个答案:

答案 0 :(得分:3)

有几种选择。

如果您的时间字符串表示一段时间

持续时间,Duration中的java.time类是正确的使用时间(以天,小时,分钟,秒和/或秒为单位):

    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秒,这是正确使用的类。一个简单的选择是在没有与UTC偏移的情况下,在符合ISO 8601格式的前提下添加字符串,类似于我在此期间所做的操作:

    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。

此代码段中的格式化程序在秒数上只需要6位小数(因为小数点后面有6个大写S)。如果您的小数位数可能不同,则需要查看DateTimeFormatterBuilder.appendFraction方法。