Date.after и Data.after в одном и том же операторе if - PullRequest
0 голосов
/ 06 декабря 2018

Если у меня есть список комнат и номер, который называется room1, который забронирован между 2018-12-12 и 2018-12-20.

А другой пользователь хочет забронировать эту комнату между 2018-12-15 и 2018-12-25.Я пытался использовать date.after(checkInDate) и date.after(checkOutDate), но это не сработало.Как это можно исправить?

 Date tempStart = checkinDate;
 Date tempEnd = checkoutDate;

 LinkedList<Integer> roomNbrs = new LinkedList<>();

 for (Booking b: books) {

     if (tempStart.equals(b.getCheckinDate()) && tempEnd.equals(b.getCheckoutDate()) && !roomNbrs.contains(roomNbr) ||
                (tempStart.after(b.getCheckinDate())) && ((tempEnd.before(b.getCheckoutDate()) || tempEnd.equals(b.getCheckoutDate()))
                        && !roomNbrs.contains(roomNbr)) ||
                ((tempStart.before(b.getCheckinDate()) || tempStart.equals(b.getCheckinDate()))
                        && tempEnd.before(b.getCheckoutDate()) && !roomNbrs.contains(roomNbr))){

             roomNbrs.add(b.getRoomNbr());
     }
}

Ответы [ 5 ]

0 голосов
/ 08 декабря 2018

Насколько я понимаю, ваша общая логика ошибочна.Вы не можете просмотреть отдельное бронирование и определить, доступен ли номер этого бронирования на требуемый период (между 2018-12-15 и 2018-12-25).

Представьте себе:

  • Номер 1 забронирован в период с 2018-12-12 по 2018-12-20.
  • Номер 2 забронирован в период с 2018-12-20 по 2018-12-30 и снова между 2019-01-10.и 2019-01-17.
  • Для номера 3 вообще нет заказов.

Теперь номера 1 и 2 недоступны в течение требуемого периода, но комната 3 доступна.

Когда вы повторяете свои бронирования:

  • Вы просматриваете бронирование номера 1, оно перекрывается с желаемым, поэтому вы не добавляете 1 в свой список.
  • Вы смотрите на первое бронирование комнаты 2, оно перекрывается, вы ничего не делаете.
  • Теперь вы смотрите на второе бронирование комнаты 2. Это не накладывается, поэтому вы добавляете комнату 2 кВаш список номеров.

Больше нет бронирований, так что мы закончили.Теперь в вашем списке неверно указан номер комнаты 2. Вместо этого он должен содержать номер комнаты № 3, но его нет.

Так что в дополнение к вашим заказам вам также необходим список номеров.

Кстатипроверить, совпадает ли конкретное бронирование с желаемым периодом, просто.Я даю вам псевдокод:

    if (tempEnd is before booking start) {
        // no overlap
    } else if (tempStart is after booking end) {
        // also no overlap
    } else {
        // overlap
    }

Это также то, что ответ exudong уже говорит.

Наконец: класс Date, который вы используете, имеет проблемы проектирования идавно устарел.Он также (несмотря на название) не подходит для представления даты, это момент времени.Вместо этого я настоятельно рекомендую вам использовать LocalDate из java.time, современного Java-API даты и времени.

Ссылка: Руководство по Oracle: Дата и время , объясняющее, как использовать java.time.

0 голосов
/ 07 декабря 2018

Мне удалось решить проблему, и вот решение:

private void viewAvailableRoomDate(Date tempStart, Date tempEnd) {

    LinkedList<Integer> roomNbrs = new LinkedList<>();

    for (Booking b : books) {

        if ((!(tempStart.after(b.getCheckinDate()) && tempEnd.after(b.getCheckinDate())) ||
                (tempStart.before(b.getCheckoutDate()) && tempEnd.after(b.getCheckoutDate())) ||
                (tempStart.before(b.getCheckinDate()) && tempEnd.after(b.getCheckoutDate()))) ||
                (tempStart.after(b.getCheckinDate()) && tempEnd.before(b.getCheckoutDate()))){
            roomNbrs.add(b.getRoomNbr());
        }
    }

}

0 голосов
/ 06 декабря 2018

Я не могу сделать это в том же операторе if, но если вы можете пойти на компромисс, чтобы иметь два ...:

for (Booking b : books) {
    if (roomNbrs.contains(b.getRoomNbr()) {

        continue;
    }
    if (tempStart.after(b.getCheckoutDate()) && tempEnd.before(b.getCheckinDate()) {
        roomNbrs.add(b.getRoomNbr());
    }
}
0 голосов
/ 06 декабря 2018

В операторе if у вас есть древовидные условия:

  1. И чекины, и даты оформления заказа равны
  2. tempStart после b.getCheckinDate() и tempEnd доили равно b.getCheckoutDate()
  3. tempStart до или равно b.getCheckinDate(), а tempEnd - до b.getCheckoutDate()

Ни одна из этих трех дат не охватывает, где tempStart - до b.getCheckinDate(), а tempEnd - после b.getCheckoutDate()

Если вы хотите узнать, доступна ли комната в тот или иной период, я думаю, что проще проверить, являются ли даты временных дат до илипосле бронирования.Тогда у вас будут следующие два условия:

  1. tempStart до b.getCheckinDate() и tempEnd до или равно b.getCheckinDate()
  2. tempStart после или равнона b.getCheckoutDate()

Код условий будет примерно таким:

tempIsBeforeBooking = tempStart.before(b.getCheckinDate()) 
                          && (tempEnd.before(b.getCheckoutDate()) 
                              || tempEnd.equals(b.getCheckinDate());


tempIsAfterBooking = tempStart.after(b.getCheckoutDate()) 
                         || tempStart.equals(b.getCheckoutDate());
0 голосов
/ 06 декабря 2018

следует перефразировать scheduling checkoutDate * before room1.checkinDate или scheduling checkinDate after room1.checkoutDate


: дата окончания нового собрания должна предшествовать дате начала room1, или дата начала нового собрания должна быть позже даты окончания room1.

...