java: суммирование разницы LocalTimes - PullRequest
4 голосов
/ 26 марта 2020

У меня есть несколько рабочих часов в LocalTime, и я хочу проверить, превышает ли время 24 часа. Время указывается в 24-часовом формате.

Например:

  1. 02: 00 - 08: 00
  2. 10: 00 - 12: 00
  3. 23: 00 - 03: 00

В приведенном выше примере он превышает 24 часа, поскольку он начинается в 02:00 и продолжается до 03:00. Допускается только go до 02:00.

Я реализовал все oop и попытался вычислить разницу во времени и суммировать ее, например:

  1. 02: 00 - 08:00 -> 6 ч
  2. 08: 00 - 10:00 -> 2 ч
  3. 10: 00 - 12:00 -> 2 ч
  4. 12: 00 - 23:00 -> 11 ч
  5. 23: 00 - 03:00 -> 4 ч

Всего будет 25 ч, поэтому больше чем 24 часа. Однако моя проблема в том, что я не могу рассчитать разницу во времени между 23:00 - 03:00, потому что LocalTime работает только до 23:59:59. Таким образом, в настоящее время я не могу рассчитать длительность за пределами 24-часового периода.

Поэтому использование ChronoUnit не будет работать:

ChronoUnit.HOURS.between(23:00, 03:00);

Я не уверен, какой подход я должен использовать для решения этой проблемы проблема

Ответы [ 2 ]

4 голосов
/ 26 марта 2020

Если вы используете LocalTime, то вы должны использовать LocalTime.MIN и LocalTime.MAX для промежуточного расчета минут между критическими временными интервалами. Вы можете сделать это как в этом методе:

public static long getHoursBetween(LocalTime from, LocalTime to) {
    // if start time is before end time...
    if (from.isBefore(to)) {
        // ... just return the hours between them,
        return Duration.between(from, to).toHours();
    } else {
        /*
         * otherwise take the MINUTES between the start time and max LocalTime
         * AND ADD 1 MINUTE due to LocalTime.MAX being 23:59:59
         */
        return ((Duration.between(from, LocalTime.MAX).toMinutes()) + 1
                /*
                 * and add the the MINUTES between LocalTime.MIN (0:00:00)
                 * and the end time
                 */
                + Duration.between(LocalTime.MIN, to).toMinutes())
                // and finally divide them by sixty to get the hours value
                / 60;
    }
}

, и вы можете использовать это в main методе, подобном этому:

public static void main(String[] args) {
    // provide a map with your example data that should sum up to 24 hours
    Map<LocalTime, LocalTime> fromToTimes = new HashMap<>();
    fromToTimes.put(LocalTime.of(2, 0), LocalTime.of(8, 0));
    fromToTimes.put(LocalTime.of(8, 0), LocalTime.of(10, 0));
    fromToTimes.put(LocalTime.of(10, 0), LocalTime.of(12, 0));
    fromToTimes.put(LocalTime.of(12, 0), LocalTime.of(23, 0));
    fromToTimes.put(LocalTime.of(23, 0), LocalTime.of(3, 0));

    // print the hours for each time slot
    fromToTimes.forEach((k, v) -> System.out.println("from " + k + " to " + v 
            + "\t==>\t" + getHoursBetween(k, v) + " hours"));

    // sum up all the hours between key and value of the map of time slots
    long totalHours = fromToTimes.entrySet().stream()
            .collect(Collectors.summingLong(e -> getHoursBetween(e.getKey(), e.getValue())));

    System.out.println("\ttotal\t\t==>\t" + totalHours + " hours");
}

, который производит вывод

from 08:00 to 10:00 ==> 2 hours
from 23:00 to 03:00 ==> 4 hours
from 10:00 to 12:00 ==> 2 hours
from 02:00 to 08:00 ==> 6 hours
from 12:00 to 23:00 ==> 11 hours
        total       ==> 25 hours
3 голосов
/ 26 марта 2020
ChronoUnit.HOURS.between(LocalTime.of(23, 0), LocalTime.of(03,0)

это даст вам -20, тогда вы можете сделать некоторую математику, если результат меньше нуля, значит 24 -20 = 4, так что использование ChronoUnit может работать, но лучше использовать LocalDateTime

...