Java比较日期以检查是否在范围内

时间:2011-11-06 21:52:51

标签: java date

好吧,不像标题那么简单可能会让它听起来。我用c#以非常原始的方式尝试了这个并且它有效,但我觉得用Java和Oracle作为数据库可以实现更好的工作。所以事情是:

我有一个预订系统。只要该范围中的每一天可以容纳所请求的数字,就可以在同一天在日期X和日期Y之间的时间段内进行多次预订。要保留的最大群集数为46.因此,从逻辑上讲,您会将每天视为46个群集预留的持有者并从中推断。

现在我遇到的困难是:

如果在数据库中存储了多个有效的预订,那么我想进行新的预订。那么我该如何检查这个新的日期范围是否属于之前预订的任何天数。这里不仅仅谈论x落在y(作为范围)。更像是:

   X_______________________________________Y
       X________________________________y
  X________________________________Y
                         X________________________________Y

你可以看到重叠正在发生。

请让我知道我怎么能这样做,因为它会影响对象的早期设计 此致

2 个答案:

答案 0 :(得分:8)

假设您的日期有两种方法:isBefore(Date other)isAfter(Date other)。显然,如果他们不这样做,你可以通过外部方法或包装或其他方法来解决这个问题。编辑:java.util.Date具有您可以使用的compareTo方法。

你这样做:

public boolean overlapsWithExisting(Booking booking) {
    final Date early = booking.getStart();
    final Date late = booking.getEnd();
    for(Booking existing : existingBookings) {
        if(!(early.isAfter(existing.getEnd()) || late.isBefore(existing.getStart()))
            return true;
    }
    return false;
}

我们将此预订与所有现有预订进行比较。如果此预订在现有预订开始之前结束,或者在现有预订结束后开始预订,则不会发生冲突。任何其他条件,它们将重叠。

每次预订都这样做。

答案 1 :(得分:1)

Joda-Time - Interval

使用Interval库中的Joda-Time类,而不是自己滚动。间隔是时间轴上的一对特定点,每个点都定义为DateTime实例。

Interval课程提供overlapgapabuts方法。

半开

这些方法明智地使用半开放方法跨越时间跨度,其中开头是包容性的,而结尾是独占的。搜索StackOverflow以获取更多信息。