将字符串覆盖到本地时间,带/不带 nanoOfSeconds

2022-09-03 08:48:01

我需要将一个字符串转换为LocalTime(java-8不是joda),该字符串中可能有也可能没有nanoOfSeconds。String 格式采用 or 的形式字符串在秒数中可能有也可能没有小数位,当它出现时,可以有任意数量的字符来表示纳秒部分。07:06:0507:06:05.123456

使用 DateTimeForamtter,例如

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss");

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss.SSSSSS");

我可以使用IF语句来区分两种格式,例如:

DateTimeFormatter dtf;
if (time1.contains(".") {
   dtf = DateTimeFormatter.ofPattern("H:mm:ss.SSSSSS);
} else {
   dtf = DateTimeFormatter.ofPattern("H:mm:ss);
}

这工作正常,我对此感到满意,但我需要能够在小数点后使用不同数量的位置。

示例数据集可能是:

[11:07:59.68750, 11:08:00.781250, 11:08:00.773437500, 11:08:01]

有没有办法允许格式化程序解析小数点后的任何位数,而不会在小数位数未知时引发a?java.time.format.DateTimeParseException

我希望我错过了一些非常简单的东西。


答案 1

无需执行任何特殊操作来解析此格式。 已经处理了可选的纳秒:LocalTime.parse(String)

System.out.println(LocalTime.parse("10:15:30"));
System.out.println(LocalTime.parse("10:15:30."));
System.out.println(LocalTime.parse("10:15:30.1"));
System.out.println(LocalTime.parse("10:15:30.12"));
System.out.println(LocalTime.parse("10:15:30.123456789"));

以上所有解析都很好,另请参阅Javadoc规范


答案 2

您可以使用格式模式的“可选部分”来实现此目的:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss[.SSSSSS]");

推荐