[英]Parse time duration with leap second like 00:00:60
如何解析秒到秒的持續時間?
例如,我們從另一個服務接收以下持續時間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();
}
這是我解決問題的方法:
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("(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d+)?)", "PT$1H$2M$3S");
timeSum = timeSum.plus(Duration.parse(durationText));
return timeSum.getSeconds();
}
歸功於Ole VV及其在這里的回答: https : //stackoverflow.com/a/52315938/2240409
這就是我們寬大的解析器風格。
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);
該代碼段的輸出為:
60
如果您的60秒確實是持續時間而不是一天中的某個時間,那么我就不太喜歡它。 然后,我寧願像您自己回答那樣將其解析為Duration
。 我知道帶有難以理解的正則表達式的String.replace
也不是一個很好的解決方案,但是我仍然認為我更喜歡它,而不是假裝持續時間是一天中的某個時間,如果這是完全錯誤的。 我只是以為無論如何我都會提出這個選擇,讓您根據自己的實際情況和偏好做出自己的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.