簡體   English   中英

用leap秒來解析持續時間,例如00:00:60

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM