2010-06-03 12 views

उत्तर

5

शुरुआत के बाद और अंत के पहले द्वारा परिभाषित एक नई सीमा प्राप्त करें, और उस नई सीमा में प्रत्येक दिन के लिए युग की शुरुआत के बाद से दिनों की संख्या निर्धारित करें।

अंतर अंतरंग में दिनों की संख्या है। केवल सकारात्मक मूल्य स्वीकार करें।

व्यक्तिगत तिथियों की बजाय खाते में स्थानांतरित करने के लिए संपादित किया गया।

+0

आपकी टिप्पणियों के लिए सभी को धन्यवाद ... महान सुझाव! मुझे एहसास नहीं हुआ कि यह इतना आसान था। – BoredOfBinary

0

प्रश्न दो तारीखों के बीच दो तारीखों के बीच पूछता है। (टिप्पणियां के जवाब में संपादित)

तो अगर आप 2 समय अवधियों (r1s, R1E) है, तो आप यह निर्धारित करने के पहले शुरू होता है की जरूरत है, वहाँ ओवरलैप है, और ओवरलैप क्या है।

double overlap(DateTime r1s, DateTime r1e, DateTime r2s, DateTime r1e){ 
    DateTime t1s,t1e,t2s,t2e; 
    if (rs1<rs2) //Determine which range starts first 
    { 
     t1s = r1s; 
     t1e = r1e; 
     t2s = r2s; 
     t2e = r2e; 
    } 
    else 
    } 
     t1s = r2s; 
     t1e = r2e; 
     t2s = r1s; 
     t2e = r1e; 
    } 

    if (t1e<t2s) //No Overlap 
    { 
     return -1; 
    } 

    if (t1e<t2e) //Partial Overlap 
    } 
     TimeSpan diff = new TimeSpan(t1e.Ticks - t2s.Ticks); 
    { 
    else //Range 2 totally withing Range 1 
    } 
     TimeSpan diff = new TimeSpan(t2e.Ticks - t2s.Ticks); 
    { 

    double daysDiff = diff.TotalDays; 
    return daysDiff; 

} 
+0

"मान लीजिए कि टी 1 हमेशा <टी 2 एस है।" हमें क्यों मानना ​​चाहिए? परीक्षा। और आपका कोड संकलित नहीं होगा। मेरा मानना ​​है कि मुझे लगता है कि आप इसके साथ कहां जा रहे हैं, लेकिन इसे बाहर निकालें और धारणाएं छोड़ दें। –

+0

आप सही हैं। इसके अलावा मैं (और ऊपर दिए गए उत्तरों) मानते हैं कि ओवरलैप है। हमें इसके लिए भी परीक्षण करने की ज़रूरत है। – WombatPM

0

अगर मैं अपने प्रश्न को समझते हैं, आप दिन है कि इस तरह के रूप में दो समय अवधियों, ओवरलैप की संख्या के लिए पूछ रहे हैं: रेंज 1 = 2010/01/01 के लिए 2010/02/01 रेंज 2 = 2010-1-5 से 2010-2-5 इस उदाहरण में अंतरण दिनों की संख्या 28 दिन होगी।

यहाँ यहाँ आर से एक उदाहरण है कि इस सवाल का जवाब स्पष्ट हो सकता है कि उदाहरण के

 DateTime rs1 = new DateTime(2010, 1, 1); 
     DateTime re1 = new DateTime(2010, 2, 1); 
     DateTime rs2 = new DateTime(2010, 1, 5); 
     DateTime re2 = new DateTime(2010, 2, 5); 

     TimeSpan d = new TimeSpan(Math.Max(Math.Min(re1.Ticks, re2.Ticks) - Math.Max(rs1.Ticks, rs2.Ticks) + TimeSpan.TicksPerDay, 0)); 
1

के लिए एक कोड नमूना है।

c_st = as.POSIXct("1996-10-14") 
c_ed = as.POSIXct("1996-10-19") 
d_st = as.POSIXct("1996-10-17") 
d_ed = as.POSIXct("1999-10-22") 

max(range(c_st,c_ed))-min(range(d_st,d_ed)) >= 0 & min(range(c_st,c_ed)) < max(range(d_st,d_ed)) 

सच यह इंगित करेगा कि वे छेड़छाड़ करते हैं, अन्यथा झूठा। [आर]

8

यहां गणना करने के लिए मैंने एक छोटी सी विधि लिखी है।

private static int inclusiveDays(DateTime s1, DateTime e1, DateTime s2, DateTime e2) 
{ 
    // If they don't intersect return 0. 
    if (!(s1 <= e2 && e1 >= s2)) 
    { 
     return 0; 
    } 

    // Take the highest start date and the lowest end date. 
    DateTime start = s1 > s2 ? s1 : s2; 
    DateTime end = e1 > e2 ? e2 : e1; 

    // Add one to the time range since its inclusive. 
    return (int)(end - start).TotalDays + 1; 
} 
+0

ग्रेट, सीधे आगे समाधान। मेरे लिए काम करता है और मेरे सभी परीक्षण पास करता है। –

संबंधित मुद्दे