Как избежать отрицательной разницы во времени?

Я разрабатываю приложение, в котором я использую Java8 Time. Я столкнулся с проблемой.

Допустим, время A равно 08:00, а время B равно 17:00, поэтому разница между этими двумя значениями времени будет равна 9 часам, что в моем случае правильно, но если время A равно 18:00, а время B равно 02:00, должно быть 8 часов, но в моем случае моя программа возвращает -16. Пожалуйста, кто-нибудь, помогите мне, как решить эту проблему.

Мой код:

@Test
public void testTime()
{
    DateTimeFormatter format = DateTimeFormatter.ofPattern("HH:mm");

    String s = "18:00";
    String e = "02:00";

    // Parse datetime string to java.time.LocalDateTime instance
    LocalTime startTime = LocalTime.parse(s, format);
    LocalTime endTime = LocalTime.parse(e, format);

    String calculatedTime = ChronoUnit.HOURS.between(startTime, endTime)%24 + ":"
            + ChronoUnit.MINUTES.between(startTime, endTime)%60;

    System.out.println(calculatedTime);

}

4 ответа

Решение

Почему бы не использовать Duration учебный класс? Он предназначен для таких ситуаций, как ваша.

    Duration calculatedTime = Duration.between(startTime, endTime);
    if (calculatedTime.isNegative()) {
        calculatedTime = calculatedTime.plusDays(1);
    }

    System.out.println(calculatedTime);

Это печатает продолжительность в формате ISO 8601:

PT8H

Чтобы отформатировать его в Java 8:

    long hours = calculatedTime.toHours();
    calculatedTime = calculatedTime.minusHours(hours);
    String formattedTime = String.format(Locale.getDefault(), "%d:%02d",
                                         hours, calculatedTime.toMinutes());
    System.out.println(formattedTime);

Это печатает

8:00

Чтобы отформатировать в Java 9 (не проверено):

    String formattedTime = String.format("%d:%02d", 
                                         calculatedTime.toHoursPart(),
                                         calculatedTime.toMinutesPart());

Если разница во времени окажется отрицательной, добавьте 24.

Simples!

(Очевидно, что при этом будут игнорироваться ночные изменения летнего времени, поэтому лучше всего делать это правильно, используя объекты длительности. Тем не менее, вам нужно будет узнать больше о датах, связанных с этими двумя временами.)

Проверьте, находится ли startTime после endTime, и при необходимости поменяйте местами опернады:

    LocalTime startTime = LocalTime.parse(s, format);
    LocalTime endTime = LocalTime.parse(e, format);
    String calculatedTimeMorning;

    if (startTime.isAfter(endTime)) {
        calculatedTimeMorning = (ChronoUnit.HOURS.between(endTime, startTime) % 24) + ":"
                + (ChronoUnit.MINUTES.between(endTime, startTime) % 60);
    } else {
        calculatedTimeMorning = (ChronoUnit.HOURS.between(startTime, endTime) % 24) + ":"
                + (ChronoUnit.MINUTES.between(startTime, endTime) % 60);
    }

Вы должны рассчитать разницу во времени по модулю 24, Поэтому возьмите разницу, как вы уже делаете, а затем вычислите ее по модулю 24, Обратите внимание, что в Java -16%24 вернется -16 так что вам действительно нужно сделать следующее:

public static int modulus(int n, int m){
    return  (n < 0) ? (m - (Math.abs(n) % m) ) %m : (n % m);
}

который всегда возвращает положительный результат.

Другие вопросы по тегам