解析带有闰秒的 LocalTime

mal*_*lat 5 java datetime leap-second

我试图了解如何DateTimeFormatter为我的应用程序构建自定义。我基本上需要处理这样写的时间"HHMMSS.FFFFFF"

我能够使用以下方法获得 99% 的结果:

import static java.time.temporal.ChronoField.HOUR_OF_DAY;
import static java.time.temporal.ChronoField.MICRO_OF_SECOND;
import static java.time.temporal.ChronoField.MINUTE_OF_HOUR;
import static java.time.temporal.ChronoField.SECOND_OF_MINUTE;
public static final DateTimeFormatter MY_TIME;
static {
    MY_TIME = new DateTimeFormatterBuilder()
            .appendValue(HOUR_OF_DAY, 2)
            .appendValue(MINUTE_OF_HOUR, 2)
            .optionalStart()
            .appendValue(SECOND_OF_MINUTE, 2)
            .optionalStart()
            .appendFraction(MICRO_OF_SECOND, 0, 6, true)
            .toFormatter().withResolverStyle(ResolverStyle.STRICT);
}
Run Code Online (Sandbox Code Playgroud)

我可以很好地处理输入:

String text = "101530";
LocalTime lt = LocalTime.parse(text, MY_TIME);
Run Code Online (Sandbox Code Playgroud)

甚至

String text = "070907.0705";
LocalTime lt = LocalTime.parse(text, MY_TIME);
Run Code Online (Sandbox Code Playgroud)

String text = "0000";
LocalTime lt = LocalTime.parse(text, MY_TIME);
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,我无法理解处理闰秒的 API,因此以下内容对我来说总是失败:

String text = "235960";
LocalTime lt = LocalTime.parse(text, MY_TIME);
Run Code Online (Sandbox Code Playgroud)

我应该如何构建我的程序DateTimeFormatterBuilder以便处理闰秒?


更新:我真的很喜欢ResolverStyle.STRICT,因为它拒绝无效输入,例如:

  • “251213”或,
  • “126100”

所以我不能ResolverStyle.LENIENT在这种情况下使用,我只是想要闰秒的额外特殊情况。

mal*_*lat 1

由于这对我的用户来说用途有限(编辑无效时间),因此我可以简单地使用以下方法处理这种特殊情况:

if (text.length() >= 6 && "60".equals(text.substring(4, 6))) {
    String newText = text.substring(0, 4) + "59" + text.substring(6);
    return LocalTime.parse(newText, MY_TIME);
}
return LocalTime.parse(text, MY_TIME);
Run Code Online (Sandbox Code Playgroud)

看来这是一个普遍接受的黑客: