4 回答

TA貢獻1842條經驗 獲得超13個贊
由于LocalTime似乎無法使用DateTimeFormatter的模式mm:ss,您還可以創建一個簡短的static輔助方法來調用。
此方法將所有解析的默認時間設置為相同的值,這不會暴露其他任何"00:"地方,如果意外輸入不同的時間,則可能容易出現錯誤。
這將確保任何Duration.between()分鐘和秒都是準確的:
public static void main(String [] args) {
? ? LocalTime start = parseHelper("20:28");
? ? LocalTime stop = parseHelper("20:18");
? ? Duration duration = Duration.between(start, stop);
? ? System.out.println(duration.getSeconds());
}
private static LocalTime parseHelper(String str) {
? ? return LocalTime.parse("00:" + str);
}
輸出:
-10
輸出將是以下 ISO-8601 格式之一:
HH:mm HH:mm:ss HH:mm:ss.SSS HH:mm:ss.SSSSSS HH:mm:ss.SSSSSSSS

TA貢獻1824條經驗 獲得超6個贊
LocalTime start = LocalTime.parse( "00:20:28" );
LocalTime stop = LocalTime.parse( "00:20:18" );
Duration duration = Duration.between( start, stop );
System.out.println(duration.getSeconds());
您以錯誤的方式保存日期。您還必須提供時間。當你傳遞2個參數(20:18)時,它認為第一個為小時,第二個為分鐘。這就是為什么它返回 600 秒。600秒等于10分鐘。這是兩個參數之間的時間差。

TA貢獻1846條經驗 獲得超7個贊
您可能使用LocalTime方法不正確。
假設你想要你所說的你想要的,訣竅是定義一個格式化程序,假設一天中的小時為 0。我們需要的parseDefaulting方法是:DateTImeFormatterBuilder
DateTimeFormatter mmssFormatter = new DateTimeFormatterBuilder()
.appendPattern("mm:ss")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.toFormatter();
LocalTime start = LocalTime.parse( "20:28", mmssFormatter );
LocalTime stop = LocalTime.parse( "20:18", mmssFormatter );
Duration duration = Duration.between( start, stop );
System.out.println(duration.getSeconds());
輸出是:
-10
時間字符串被解析為時間 00:20:28 和 00:20:18。我不明白的是,將自己限制在晚上 00:00:00 到 01:00:00 之間的時間有什么意義。相反,如果您的時間相對于某個點(不一定是 00:00),那么使用Duration它們可能更正確。這個想法是,20:28 不是一天中的某個時間,但可以視為測量基準和開始時間之間的持續時間。然后您可以減去持續時間:
Duration relativeStart = parseDuration("20:28");
Duration relativeStop = parseDuration("20:18");
Duration duration = relativeStop.minus(relativeStart);
System.out.println(duration.getSeconds());
我正在使用這個輔助方法:
private static Duration parseDuration(String timeString) {
String isoTimeString = timeString.replaceFirst("(\\d{2}):(\\d{2})", "PT$1M$2S");
return Duration.parse(isoTimeString);
}
由于Duration.parse只能解析 ISO 8601 格式的字符串,例如PT20M28S,我使用正則表達式將字符串轉換為這種格式。
輸出與之前相同。

TA貢獻1942條經驗 獲得超3個贊
問題是你不能有一個只有分鐘和秒的格式化程序,小時是強制性的。一種可能的方法是在字符串前面添加默認小時:
LocalTime start = LocalTime.parse("00:20:28");
LocalTime stop = LocalTime.parse("00:20:18");
Duration duration = Duration.between( start, stop );
System.out.println(duration.getSeconds());
輸出:-10
另一種可能的方法是使用of具有默認時間的方法:
LocalTime start = LocalTime.of(0, 20, 28);
LocalTime stop = LocalTime.of(0, 20, 18);
Duration duration = Duration.between( start, stop );
System.out.println(duration.getSeconds());
輸出:-10
添加回答
舉報