Date.after 和 Data.after 在同一个 if 语句中

Date.after and Data.after in the same if statement

如果我有一个房间列表和一个名为 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());
     }
}

scheduling checkoutDate 应该 before room1.checkinDatescheduling checkinDate after room1.checkoutDate


换句话说: 新会议的结束日期应早于房间 1 的开始日期,或者新会议的开始日期应晚于房间 1 的结束日期。

我不能在同一个 if 语句中做,但如果你能妥协有两个...:[=​​11=]

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

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

在 if 语句中你有树条件:

  1. 两个 chekin 日期和两个结帐日期相同
  2. tempStartb.getCheckinDate() 之后,tempEndb.getCheckoutDate()
  3. 之前或等于
  4. tempStartb.getCheckinDate()之前或等于b.getCheckinDate()tempEndb.getCheckoutDate()
  5. 之前

None 这 3 个涵盖日期,其中 tempStartb.getCheckinDate() 之前,tempEnd 在 b.getCheckoutDate()

之后

如果你想看的是这段时间有没有空房,我觉得测试临时日期是在预订之前还是之后更容易。那么你就会有这两个条件:

  1. tempStartb.getCheckinDate()之前,tempEndb.getCheckinDate()
  2. 之前或等于
  3. 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());

我设法解决了问题,这是解决方案:

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());
        }
    }

}

据我所知,你的整体逻辑是有缺陷的。您无法查看单个预订并确定该预订的房间在所需期间(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
    }

这也是已经说过的。

最后:您使用的Dateclass存在设计问题,早已过时。它也(尽管它的名字)不适合表示日期,它是一个时间点。相反,我热烈建议您使用 java.time 中的 LocalDate,现代 Java 日期和时间 API。

Link: Oracle tutorial: Date Time 解释如何使用 java.time.