我试图解析秒和纳秒,即10.337000,在Java 8中,其中10是秒,而337000是纳秒。我无法弄清楚如何将这些值解析为LocalTime
。
我尝试了DateTimeFormatter.ofPattern("ss:nnnnnn")
,但是没有用。
最佳答案
有两种选择。
如果您的时间字符串表示时间量
在一段时间内,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
我们得到了3.37亿纳秒。我认为这是正确的,因为在一秒内有1,000,000,000纳秒(百万分之一秒称为微秒)。
Duration
类具有有限的解析和格式化功能。它解析ISO 8601格式(类似于PT10.337000S
),因此我只在字符串的前面和结尾放置了正确的字母,就可以了。您会看到Duration.toString()
也将打印相同的格式(省略了多余的0个小数)。如果您的时间字符串表示一天中的某个时间
您要求输入
LocalTime
。 LocalTime
是一天中的某个小时,因此,如果您打算在午夜之后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。此代码段中的格式化程序要求精确到秒的6位小数(因为小数点后有6个大写
S
)。如果小数位数可能有所不同,则需要查看DateTimeFormatterBuilder.appendFraction
方法。