Java Сравнить даты, чтобы проверить, если в диапазоне - PullRequest
7 голосов
/ 07 ноября 2011

хорошо, не так просто, как может показаться название.Я попробовал это очень простым способом с помощью c #, и это сработало, но у меня есть ощущение, что лучше работать с Java и Oracle в качестве базы данных.Итак, дело в том:

У меня есть система бронирования.можно сделать несколько бронирований в один и тот же день за период между датой X и датой Y, если каждый день в диапазоне может соответствовать запрошенному номеру.Максимальное количество резервируемых кластеров - 46. Следовательно, логически вы будете рассматривать каждый день как держатель 46 резервирований кластеров и делать вывод из этого.

Теперь мне сложно разобраться:

, когда в базе данных хранится n номеров и они действительны, тогда я хочу сделать новое бронирование.Так как я могу проверить, попадает ли этот новый диапазон дат в какой-либо из ранее забронированных дней или нет.Не говорю просто о x, падающем в y (как диапазоны).Больше похоже на:

   X_______________________________________Y
       X________________________________y
  X________________________________Y
                         X________________________________Y

как вы можете видеть, что перекрытие происходит.

Пожалуйста, дайте мне знать, как я могу это сделать, так как это повлияет на раннее проектирование объектов. С уважением

Ответы [ 2 ]

8 голосов
/ 07 ноября 2011

Предположим, у вашей даты есть два метода: isBefore(Date other) и isAfter(Date other).Очевидно, что если они этого не делают, вы можете вылечить это с помощью внешнего метода или обертывания или чего-то еще.Изменить: java.util.Date имеет метод compareTo, который вы можете использовать.

Вы делаете это:

public boolean overlapsWithExisting(Booking booking) {
    final Date early = booking.getStart();
    final Date late = booking.getEnd();
    for(Booking existing : existingBookings) {
        if(!(early.isAfter(existing.getEnd()) || late.isBefore(existing.getStart()))
            return true;
    }
    return false;
}

Мы сравниваем это бронирование со всеми существующими бронированиями.Если это бронирование заканчивается до того, как уже начинается существующее бронирование, или если это бронирование начинается после того, как заканчивается существующее бронирование, оно не конфликтует.Любые другие условия, и они будут перекрываться.

Делайте это с каждым бронированием.

1 голос
/ 04 мая 2015

Joda-Time - Interval

Вместо того, чтобы бросать свой собственный, используйте класс Interval в библиотеке Joda-Time . Интервал - это пара определенных точек на временной шкале, каждая из которых определена как DateTime экземпляр.

Класс Interval предлагает методы overlap, gap и abuts.

Half-Open

Эти методы разумно используют подход Half-Open для промежутков времени, когда начало включительно, а окончание - эксклюзивно. Поиск StackOverflow для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...