Проверяем пересечение бронирований на Java!
Проверяем пересечение бронирований на Java! В календаре нужно отклонить новую бронь, если выбранное время уже занято. Для проверки достаточно сравнить начало и конец двух интервалов, не перебирая каждую минуту внутри них. Сделаем модель с полуоткрытым интервалом, где начало включается, а конец уже свободен: record Booking(LocalDateTime start, LocalDateTime end) { Booking { if (!start.isBefore(end)) { throw new IllegalArgumentException("End must be after start"); } } boolean overlaps(Booking other) { return start.isBefore(other.end()) && other.start().isBefore(end); } } Проверка не даст создать бронь нулевой или отрицательной длины. Условие пересечения учитывает обе границы и не считает соседние интервалы конфликтом. Подготовим уже занятые промежутки и новый запрос: List<Booking> existing = List.of( new Booking(start1, end1), new Booking(start2, end2) ); Booking requested = new Booking(requestStart, requestEnd); Здесь предполагается, что все значения уже приведены к одной временной зоне. Для расписания в нескольких регионах лучше сравнивать Instant, а исходный ZoneId сохранять отдельно. Проверим весь список и получим понятный результат: boolean conflict = existing.stream() .anyMatch(booking -> booking.overlaps(requested)); anyMatch завершает проверку, как только найдёт первое пересечение. Если conflict равен false, новую бронь можно добавить, а интервалы, которые соприкасаются ровно по границе, останутся допустимыми. Java Библиотека | Мы в Телеграм