import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Objects;

class Main {

	public static void main(String[] args) {
		var startDate = LocalDate.of(2021, 10, 7);
		var endDate = LocalDate.of(2021, 10, 14); // Exactly a week
		var zone = ZoneId.of("Europe/Amsterdam");

		var result = startDate.datesUntil(endDate)
			.map(date -> nonWeekendHours(date, zone))
			.reduce(Duration.ZERO, Duration::plus);
		System.out.println(result);
	}

	private static Duration nonWeekendHours(LocalDate date, ZoneId zone) {
		LocalTimeRange result;
		switch (date.getDayOfWeek()) {
			case MONDAY:
			case TUESDAY:
			case WEDNESDAY:
			case THURSDAY:
				result = new LocalTimeRange(LocalTime.MIN, null);
				break;
			case FRIDAY:
				result = new LocalTimeRange(null, LocalTime.NOON);
				break;
			case SATURDAY:
			case SUNDAY:
				result = new LocalTimeRange(null, null);
				break;
			default:
				throw new IllegalArgumentException("This cannot happen, actually");
		};
		return result.toDuration(date, zone);
	}
}

class LocalTimeRange {

	public static final LocalTimeRange EMPTY = new LocalTimeRange(null, null);

	private final LocalTime start;
	private final LocalTime endExclusive;

	public LocalTimeRange(LocalTime start, LocalTime endExclusive) {
		this.start = start;
		this.endExclusive = endExclusive;
	}

	public Duration toDuration(LocalDate date, ZoneId zone) {
		if (start == null && endExclusive == null) {
			return Duration.ZERO;
		}

		var s = ZonedDateTime.of(date, Objects.requireNonNullElse(start, LocalTime.MIN), zone);
		ZonedDateTime e;
		if (endExclusive != null) {
			e = ZonedDateTime.of(date, endExclusive, zone);
		}
		else {
			e = ZonedDateTime.of(date.plusDays(1), LocalTime.MIN, zone);
		}
		return Duration.between(s, e);
	}
}
