Возможно, вы неправильно используете 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
Я использую регулярное выражение для преобразования вашей строки в этот формат.
Вывод такой же, как и раньше.