My lib Time4J (v5.0) предлагает следующее готовое решение для всей вашей бизнес-задачи:
DayPartitionRule rule =
new DayPartitionBuilder()
.addWeekdayRule(
Weekday.MONDAY,
ClockInterval.between(PlainTime.of(8, 0), PlainTime.of(10, 0)))
.addWeekdayRule(
Weekday.TUESDAY,
ClockInterval.between(PlainTime.of(10, 0), PlainTime.of(15, 0)))
.build();
Map<Integer, TimestampInterval> events = new HashMap<>();
events.put(
1,
TimestampInterval.between(
PlainTimestamp.of(2018, 1, 1, 8, 0),
PlainTimestamp.of(2018, 1, 1, 9, 0)));
events.put(
2,
TimestampInterval.between(
PlainTimestamp.of(2018, 1, 1, 10, 0),
PlainTimestamp.of(2018, 1, 1, 12, 0)));
events.put(
3,
TimestampInterval.between(
PlainTimestamp.of(2018, 1, 2, 10, 0),
PlainTimestamp.of(2018, 1, 2, 12, 0)));
events.forEach(
(id, interval) -> System.out.println(
"Event: " + id + " => "
+ Duration.formatter(ClockUnit.class, "#h:mm").format(
interval
.streamPartitioned(rule)
.map(i -> i.getDuration(ClockUnit.HOURS, ClockUnit.MINUTES))
.collect(Duration.summingUp())
.with(Duration.STD_CLOCK_PERIOD)
)));
Вывод:
Событие: 1 => 1: 00
Событие: 2 => 0: 00
Событие: 3 => 2: 00
Алгоритм использует диапазон-пакет Time4J и по-прежнему работает должным образом, если у вас есть более одного тактового интервала в день недели или если интервал ввода превышает один день (который требует суммирования длительностей).
Кстати, я предполагаю, что ваша первая интервальная строка «2018-01-01 08:00, 2018-01-01 08:00» содержит опечатку, поэтому я настроил время окончания на 9 утра (в результатеожидаемая продолжительность одного часа).