2016-01-13 99 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)))