Анализ военного времени LocalTime 00:00

Я просмотрел почти все другие сообщения, относящиеся к моему вопросу, и не нашел такой же проблемы, как у меня.

Я пытаюсь получить время между двумя полями, используя этот код.

LocalTime timeFrom = LocalTime.parse("16:00");
LocalTime timeTo = LocalTime.parse("00:00");

System.out.println(Duration.between(timeFrom,timeTo).toHours());

У меня проблема в том, что распечатка отрицательная 16 часов. Чего я хочу добиться, так это получить количество времени с 16:00 (что составляет 16:00) до 12:00 (что составляет 00:00).

Результат, который я ищу, будет 8 часов.

У меня есть идея взять 1 минуту с 00:00, затем получить продолжительность между ними, а затем просто добавить к ней 1 минуту, но я подумал, что должен быть более простой способ.


person exceptionsAreBad    schedule 07.02.2020    source источник


Ответы (2)


После размышлений я чувствую, что искал решение для программиста, а не простое...

Ответ на это просто добавить 24 часа назад к отрицательному результату!

LocalTime timeFrom = LocalTime.parse("16:00");
LocalTime timeTo = LocalTime.parse("00:00");


long elapsedMinutes = Duration.between(timeFrom, timeTo).toMinutes();

//at this point Duration for hours is -16.

//checking condition
if(timeTo.toString().equalsIgnoreCase("00:00")){
   //condition met, adding 24 hours(converting to minutes)
   elapsedMinutes += (24 * 60);
}
long elapsedHours = elapsedMinutes / 60;
long excessMinutes = elapsedMinutes % 60;


System.out.println("Hours: " + elapsedHours);
System.out.println("Minutes: " + excessMinutes);
person exceptionsAreBad    schedule 07.02.2020

Предлагаю проверить, если результат отрицательный, тогда вы не ограничиваете код проверкой на точное равенство строк, и 00:01 все равно выйдет 8 часов:

import java.time.Duration;
import java.time.LocalTime;

public class StackOverflowTest {
  public static void main(String[] args) {
    String from = "16:00";
    String to   = "00:01";

    LocalTime timeFrom = LocalTime.parse(from);
    LocalTime timeTo = LocalTime.parse(to);

    Duration duration = Duration.between(timeFrom,timeTo);
    if (duration.isNegative()) duration = duration.plusDays(1);

    System.out.println(duration.toHours());
  }
/*
Prints:
8
*/
}

Или, возможно, или более удобный для читателя вариант:

...snip
Duration duration;
if (timeFrom.isBefore(timeTo)) {
  duration = Duration.between(timeFrom,timeTo);
} else {
  duration = Duration.between(timeFrom,timeTo).plusDays(1);
}
person Scratte    schedule 07.02.2020