Java 同一if语句中的Date.after和Data.after
如果我有一个房间列表和一个名为room1的特定房间,该房间在2018-12-12和2018-12-20之间预订 另一位用户希望在2018-12-15和2018-12-25之间预订该房间。我尝试使用Java 同一if语句中的Date.after和Data.after,java,intervals,date-comparison,date,Java,Intervals,Date Comparison,Date,如果我有一个房间列表和一个名为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> r
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());
}
}
datetempstart=checkinDate;
日期tempEnd=签出日期;
LinkedList roomNbrs=新建LinkedList();
预订(b:书籍){
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))){
添加(b.getRoomNbr());
}
}
计划签出日期应在room1之前。签入日期或在room1之后安排签入日期。签出日期
改写:
新会议的结束日期应在room1的开始日期之前,或者新会议的开始日期应在room1的结束日期之后。我不能在相同的if语句中这样做,但如果您可以折衷为有两个…:
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()
,而tempEnd
位于b.getCheckoutDate()之前
这三个日期都不包括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());
}
}
private void viewAvailableRoomDate(日期tempStart,日期tempEnd){
LinkedList roomNbrs=新建LinkedList();
预订(b:书籍){
if((!(tempStart.after(b.getCheckinDate())和&tempEnd.after(b.getCheckinDate()))||
(tempStart.before(b.getCheckoutDate())和tempsend.after(b.getCheckoutDate()))||
(tempStart.before(b.getCheckinDate())&tempsend.after(b.getCheckoutDate()))||
(tempStart.after(b.getCheckinDate())和tempEnd.before(b.getCheckoutDate())){
添加(b.getRoomNbr());
}
}
}据我所知,您的总体逻辑有缺陷。您无法查看单个预订并确定该预订的房间是否在所需期间(2018-12-15至2018-12-25)可用
想象一下:
- 1号房间在2018-12-12和2018-12-20之间预订
- 2号房间在2018年12月20日至2018年12月30日期间预订,2019年1月10日至2019年1月17日期间再次预订
- 3号房间根本没有预订
现在,1号和2号房间在通缉期间都不可用,但3号房间可用
当您反复查看您的预订时:
- 您查看1号房间的预订,它与想要的房间重叠,因此您不会将1添加到您的列表中
- 你看第一次订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
类存在设计问题,并且早已过时。它也(尽管它的名字)不适合代表一个日期,它是一个时间点。相反,我强烈建议您使用java.time中的LocalDate
,这是现代java日期和时间API
链接:解释如何使用java。时间
显示您的代码以更好地说明您的描述。与其使用如此复杂的if
条件,不如将内容移到描述性帮助器方法中。我同意。下次:)可能重复的?你能用另一种方式解释吗?新会议的结束日期应该在room1的开始日期之前,或者新会议的开始日期应该在room1的结束日期之后date@exudong请在您的回答中添加此评论。大多数都使用答案正文而不是注释。这似乎不正确,只有当b.getCheckoutDate()在b.getCheckinDate()之前或tempStart在TempEnd之后时,才会返回true。我认为这也不正确。至少你把括号弄错了。它似乎也没有考虑到当tempStart
等于b时的情况。getCheckinDate()
和/或tempEnd
等于b.getCheckoutDate()
。我检查了所有可能的场景,在上述解决方案的帮助下,它似乎工作得相当好。甚至你提到的场景也在起作用@OleV.V.I也为您测试了if
语句。当然不是