使用闰秒解析持续时间,如 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
【讨论】:
很高兴我能提供间接帮助。您不需要ZERO
和 plus
操作。只需将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 的时间跨度