2011-09-19 14 views
6

के साथ दाएं-असंबद्ध समय अंतराल की तुलना करें क्या गीलेर दो कठोर-अंतराल अंतराल (अंतराल पर एक सीमा के अंतराल) को ओवरलैप या नहीं निर्धारित करना संभव है?joda-lib

Instant now = new Instant(new Date().getTime()); 
Interval i2 = new Interval(now, (ReadableInstant) null); 
Interval i1 = new Interval(now, (ReadableInstant) null); 
boolean overlapping = i2.overlaps(i1); 

लेकिन डॉक्स के अनुसार, null का उपयोग कर एक दूसरा पैरामीटर का मतलब है के रूप में "अब" के बजाय "अनंत" की:

मैं इस की कोशिश की है (और अन्य समान विविधताओं)।

EDIT: मुझे मेलिंग सूची में this answer मिला है, इसलिए यह जोडा के साथ असंभव प्रतीत होता है। अब मैं वैकल्पिक कार्यान्वयन की तलाश में हूं।

+1

'' एक ** [आधा खुला अंतराल] (http://en.wikipedia.org/wiki/Half-open_interval#Terminology) ** नहीं एक ही बात के रूप में "एक सीमा के साथ अंतराल है अनंत पर। " '' –

+0

मैंने @Matt टिप्पणियों के साथ प्रश्न संपादित किया है –

उत्तर

4

दोनों अंतराल t = -∞ से शुरू, या तो दोनों अंतराल t = +∞ में खत्म करते हैं, वे करेंगे हमेशा ओवरलैप, आरंभ तिथि की परवाह किए बिना।

तो t = +∞ पर t = -∞ पर अंतराल A शुरू होता है और अंतराल B शुरू होता है, वे iff
A.start > B.start ओवरलैप।

2

Hacky समाधान:

/** 
* Checks if two (optionally) unbounded intervals overlap each other. 
* @param aBeginn 
* @param aEnde 
* @param bBeginn 
* @param bEnde 
* @return 
*/ 
public boolean checkIfOverlap(LocalDate aBeginn,LocalDate aEnde, LocalDate bBeginn,LocalDate bEnde){ 
    if(aBeginn == null){ 
     //set the date to the past if null 
     aBeginn = LocalDate.now().minusYears(300); 
    } 
    if(aEnde == null){ 
     aEnde = LocalDate.now().plusYears(300); 
    } 
    if(bBeginn == null){ 
     bBeginn = LocalDate.now().minusYears(300); 
    } 
    if(bEnde == null){ 
     bEnde = LocalDate.now().plusYears(300); 
    } 

    if(aBeginn != null && aEnde != null && bBeginn != null && bEnde != null){ 
     Interval intervalA = new Interval(aBeginn.toDateTimeAtStartOfDay(),aEnde.toDateTimeAtStartOfDay()); 
     Interval intervalB = new Interval(bBeginn.toDateTimeAtStartOfDay(),bEnde.toDateTimeAtStartOfDay()); 
     if(intervalA.overlaps(intervalB)){ 
      return true; 
     } 
    } else{ 
     return false; 
    } 
    return false; 
} 
+1

अब +/- 300 साल के बजाय, इस न्यूनतम तिथि का उपयोग किया जा सकता है: 'नया लोकलडेट (-292_275_054, 1, 1);' (वर्ष -292,275,054 ईसा पूर्व) और इस अधिकतम तिथि का उपयोग 'नया लोकलडेट (2 9 2_278_993, 12, 31)' (वर्ष 2 9 2,278,993 ईस्वी) किया जा सकता है। इन सीमाओं को [जोडा-टाइम ग्रेगोरियन क्रोनोलॉजी क्लास] में परिभाषित किया गया है (http://grepcode.com/file/repo1.maven.org/maven2/joda-time/joda-time/2.7/org/joda/time/chrono/GregorianChronology जावा # GregorianChronology.0MIN_YEAR)। –

1

मैं का उपयोग कर की सलाह देते हैं एक Range<DateTime> (from Guava) है, जो सभी निर्माण विकल्प और तुलना कार्यों की जरूरत है प्रदान करना चाहिए।

Range<DateTime> r1= Range.atLeast(DateTime.now()); 
Range<DateTime> r2 = Range.atLeast(DateTime.now()); 
boolean overlap = r1.isConnected(r2) && !r1.intersection(r2).isEmpty();