Java 同一if语句中的Date.after和Data.after

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

如果我有一个房间列表和一个名为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());
     }
}
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
    语句。当然不是