2016-01-13 101 views
0

所以基本上我在寻找的是防止日期互相重叠的更好方法。因此,如果我已经创建了一个2016年10月9日至2016年9月15日期间的活动,那么我创建的下一个活动不能在这两个日期之间。如何有效检查日期范围是否不重叠?

这里的代码是我到目前为止,但我认为这是混乱的,我甚至不确定它是否正常工作。

(fromDate.isAfter(element.getFromDate()) && fromDate.isBefore(element.getToDate()) || toDate.isAfter(element.getFromDate()) && toDate.isBefore(element.getToDate()) || fromDate.isBefore(element.getFromDate()) && toDate.isAfter(element.getToDate()) || fromDate.isEqual(element.getFromDate()) && toDate.isEqual(element.getToDate()) || fromDate.isBefore(element.getFromDate()) && toDate.isEqual(element.getToDate()) || fromDate.isEqual(element.getFromDate()) && toDate.isAfter(element.getToDate()))

我使用java.time.LocalDate

+1

番石榴有一个不错的RangeSet类,可以在这里使用 – 2016-01-13 19:08:55

回答

4

也就是说凌乱,而且可以大大简化。这是两个日期范围重叠的所有可能性。称他们为“A,B”和“X,Y”:

   x  y  
     ------------------- 
     a b     no overlap 
         a b  no overlap 

       a b    full overlap 
     a    b  full overlap 
     a  b     partial (b = x) 
     a  b    partial 
     a   b   partial (b = y) 
     a    b  partial 
       a   b  partial (a = x) 
       a  b  partial 
        a b  partial (a = y) 

既然你只关心在重叠的情况下,你可以简单地颠倒逻辑,并检查没有重叠,这可以归结为:

if (!((b < x) || (a > y)))