使用/不使用nanoOfSeconds将字符串转换为LocalTime

jbo*_*olt 11 java formatter localtime java-8 java-time

我需要将一个字符串转换为LocalTime(java-8而不是joda),该字符串可能有也可能没有nanoOfSeconds.String格式的形式为 07:06:05或者07:06:05.123456 字符串在秒内可能有或没有小数位,当它出现时,可以有任意数量的字符来表示Nano Seconds部分.

使用DateTimeForamtter等

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss");
Run Code Online (Sandbox Code Playgroud)

要么

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss.SSSSSS");
Run Code Online (Sandbox Code Playgroud)

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

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

这工作正常,我很好,但我需要能够在小数点后使用不同数量的位置.

示例数据集可能是:

[11:07:59.68750, 11:08:00.781250, 11:08:00.773437500, 11:08:01]
Run Code Online (Sandbox Code Playgroud)

有没有办法允许格式化程序解析小数点后的任意数字位数而不会java.time.format.DateTimeParseException在小数位数未知时抛出?

我希望我遗漏一些非常简单的东西.

Jod*_*hen 29

没有必要做任何特殊的事情来解析这种格式.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"));
Run Code Online (Sandbox Code Playgroud)

以上所有解析都很好,另见Javadoc 规范.


Jon*_*eet 8

您可以使用格式模式的"可选部分":

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss[.SSSSSS]");
Run Code Online (Sandbox Code Playgroud)

  • @jbolt:如果你澄清你的问题来解释你的意思,那会有所帮助. (2认同)
  • @jbolt:那还不是很清楚.给出你所要求的例子会更清楚. (2认同)
  • @jbolt:不是很多 - 你是说*如果*超过3个小数位,你还只想解析前三个?再次,*示例*将有所帮助 - 样本输入和预期输出. (2认同)