在 Java 8 中解析 (ss.nnn) 秒和纳秒
Parse (ss.nnn) second and nanosecond in Java 8
我正在尝试解析秒和纳秒,即 10.337000,其中 10 是秒,337000 是 Java 8 中的纳秒。我无法计算我应该如何将这些值解析为 LocalTime
.
我试过DateTimeFormatter.ofPattern("ss:nnnnnn")
,但没用。
有几个选项。
如果您的时间字符串表示时间量
对于持续时间、时间量(以天、小时、分钟、秒为单位 and/or 秒的小数部分),java.time
中的 Duration
class 是正确使用:
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
class 的解析和格式化功能有限。它解析 ISO 8601 格式,类似于 PT10.337000S
,因此我只需将正确的字母放在字符串的前面和末尾,它就起作用了。您会看到 Duration.toString()
也打印相同的格式(省略多余的 0 小数)。
如果您的时间字符串表示一天中的某个时间
您要求 LocalTime
。 LocalTime
表示一天中的小时数,因此如果您打算在午夜过后 10.337 秒,则应使用正确的 class。一个简单的选择是在没有与 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
of 00:00:10.337.
此代码段中的格式化程序要求在秒上正好有 6 位小数(因为小数点后有 6 个大写 S
)。如果您的小数位数可能不同,您需要查看 DateTimeFormatterBuilder.appendFraction
方法。
我正在尝试解析秒和纳秒,即 10.337000,其中 10 是秒,337000 是 Java 8 中的纳秒。我无法计算我应该如何将这些值解析为 LocalTime
.
我试过DateTimeFormatter.ofPattern("ss:nnnnnn")
,但没用。
有几个选项。
如果您的时间字符串表示时间量
对于持续时间、时间量(以天、小时、分钟、秒为单位 and/or 秒的小数部分),java.time
中的 Duration
class 是正确使用:
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
class 的解析和格式化功能有限。它解析 ISO 8601 格式,类似于 PT10.337000S
,因此我只需将正确的字母放在字符串的前面和末尾,它就起作用了。您会看到 Duration.toString()
也打印相同的格式(省略多余的 0 小数)。
如果您的时间字符串表示一天中的某个时间
您要求 LocalTime
。 LocalTime
表示一天中的小时数,因此如果您打算在午夜过后 10.337 秒,则应使用正确的 class。一个简单的选择是在没有与 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
of 00:00:10.337.
此代码段中的格式化程序要求在秒上正好有 6 位小数(因为小数点后有 6 个大写 S
)。如果您的小数位数可能不同,您需要查看 DateTimeFormatterBuilder.appendFraction
方法。