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.checkinDate
或 scheduling 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 语句中你有树条件:
- 两个 chekin 日期和两个结帐日期相同
tempStart
在 b.getCheckinDate()
之后,tempEnd
在 b.getCheckoutDate()
之前或等于
tempStart
在b.getCheckinDate()
之前或等于b.getCheckinDate()
,tempEnd
在b.getCheckoutDate()
之前
None 这 3 个涵盖日期,其中 tempStart
在 b.getCheckinDate()
之前,tempEnd 在 b.getCheckoutDate()
之后
如果你想看的是这段时间有没有空房,我觉得测试临时日期是在预订之前还是之后更容易。那么你就会有这两个条件:
tempStart
在b.getCheckinDate()
之前,tempEnd
在b.getCheckinDate()
之前或等于
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
}
这也是已经说过的。
最后:您使用的Date
class存在设计问题,早已过时。它也(尽管它的名字)不适合表示日期,它是一个时间点。相反,我热烈建议您使用 java.time 中的 LocalDate
,现代 Java 日期和时间 API。
Link: Oracle tutorial: Date Time 解释如何使用 java.time
.
如果我有一个房间列表和一个名为 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.checkinDate
或 scheduling 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 语句中你有树条件:
- 两个 chekin 日期和两个结帐日期相同
tempStart
在b.getCheckinDate()
之后,tempEnd
在b.getCheckoutDate()
之前或等于
tempStart
在b.getCheckinDate()
之前或等于b.getCheckinDate()
,tempEnd
在b.getCheckoutDate()
之前
None 这 3 个涵盖日期,其中 tempStart
在 b.getCheckinDate()
之前,tempEnd 在 b.getCheckoutDate()
如果你想看的是这段时间有没有空房,我觉得测试临时日期是在预订之前还是之后更容易。那么你就会有这两个条件:
tempStart
在b.getCheckinDate()
之前,tempEnd
在b.getCheckinDate()
之前或等于
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
}
这也是
最后:您使用的Date
class存在设计问题,早已过时。它也(尽管它的名字)不适合表示日期,它是一个时间点。相反,我热烈建议您使用 java.time 中的 LocalDate
,现代 Java 日期和时间 API。
Link: Oracle tutorial: Date Time 解释如何使用 java.time
.