使用闰秒解析持续时间,如 00:00:60

Posted

技术标签:

【中文标题】使用闰秒解析持续时间,如 00:00:60【英文标题】:Parse time duration with leap second like 00:00:60 【发布时间】:2018-09-25 09:12:48 【问题描述】:

如何解析闰秒到秒的持续时间?

例如,我们从另一个服务接收以下持续时间 00:00:60,这意味着 1 分钟,但 Java 8 DateTimeFormatter.ofPattern("HH:mm:ss[.SSS]") 抛出

java.time.format.DateTimeParseException: Text '00:00:60' could not be parsed: Invalid value for SecondOfMinute (valid values 0 - 59): 60

这是有道理的,因为 Java 使用的 ISO 标准中没有 60 秒的概念。

我想避免使用 String::replace(如其他类似案例的 SO 答案中所建议的那样),并尽可能避免使用外部库。

这是当前引发异常的代码:

private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss[.SSS]");

public static Integer parseToSeconds(String durationText) 

    return LocalTime.parse(durationText, TIME_FORMATTER).toSecondOfDay();

【问题讨论】:

持续时间不能有闰秒。只有一天中的某个时间可以,而且只能在 23:59:60。 您收到持续时间的服务似乎发送了错误的结果。它应该发送 00:01:00 代替。如果你应该管理这个,你必须编写自己的解析器 android : how can I add 5 Times in a variable and get total seconds of them 的可能重复项,至少那里的答案也适用于您的输入字符串。另一方面,您没有得到验证:他们也会接受92:93:94 @RobertKock 是的,服务是错误的,但它是我无法控制的外部服务。我希望java中有一些深层方法可以帮助解决这些情况 @OleV.V.是的,我知道,这就是我在问题第 4 段中的意思。外部服务是错误的,但我无法更改它。这是一家外部公司,不幸的是,他们没有改变它。 【参考方案1】:

这就是我解决问题的方法:

private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss[.SSS]");

public static long parsesToSeconds(String durationText) 
    Duration timeSum = Duration.ZERO;
    // Reformat to ISO 8601
    durationText = durationText.replaceFirst("(\\d2):(\\d2):(\\d2(?:\\.\\d+)?)", "PT$1H$2M$3S");

    timeSum = timeSum.plus(Duration.parse(durationText));

    return timeSum.getSeconds();

感谢 Ole V.V.他的回答在这里:https://***.com/a/52315938/2240409

【讨论】:

很高兴我能提供间接帮助。您不需要 ZEROplus 操作。只需将Duration.parse(durationText) 分配给Duration 变量(名称不包含误导性“sum”),然后返回其getSeconds()【参考方案2】:

这就是我们使用 lenient resolver 风格的原因。

    String durationText = "00:00:60";
    DateTimeFormatter lenientTimeFormatter = DateTimeFormatter.ISO_LOCAL_TIME
            .withResolverStyle(ResolverStyle.LENIENT);
    int seconds = LocalTime.parse(durationText, lenientTimeFormatter).toSecondOfDay();
    System.out.println(seconds);

这个 sn-p 的输出是:

60

如果你的 60 秒真的是一段持续时间,而不是一天中的某个时间,我真的不喜欢它。然后我宁愿解析成Duration,就像您在自己的答案中所做的那样。我知道带有难以阅读的正则表达式的String.replace 也不是一个很好的解决方案,但我仍然认为我更喜欢它而不是假装持续时间是一天中的某个时间,如果这是完全错误的。我只是想无论如何我都会提出这个选项,让你根据自己的实际情况和喜好做出自己的选择。

【讨论】:

是的,就我而言,持续时间确实是持续时间,而不是一天中的时间。感谢您的意见。

以上是关于使用闰秒解析持续时间,如 00:00:60的主要内容,如果未能解决你的问题,请参考以下文章

如何用正则表达式判断时间输入是不是正确?格式为00:00,小时是00-23,分钟是00-60,秒钟00-60

python常用标准库(时间模块time和datetime)

时间那点事儿

TCP 错误代码 10061:无法连接到 net.tcp://。连接尝试持续了 00:00:01.0156241 的时间跨度

生成预约时间段

简述unix时间戳