2010-06-03 21 views

cevap

5

Başlangıcın ilerleyen bölümlerinde ve sonlarında daha önce tanımlanan yeni aralığı edinin ve bu yeni aralıkta her gün için çağın başlangıcından itibaren geçen gün sayısını belirleyin.

Fark, kavşaktaki gün sayısıdır. Sadece pozitif değerleri kabul et.

Tek tek tarihler yerine aralıkları hesaba katmak üzere düzenlenmiştir.

+0

Yorumlarınız için hepinize teşekkür ederiz ... Harika öneriler! Bunun çok basit olduğunu anlayamadım. – BoredOfBinary

0

Soru, iki tarih aralığını değil iki tarih arasında sorar. (Açıklamalara yanıt olarak düzenlendi)

2 Tarih Aralığınız varsa (r1s, r1e), hangisinin ilk önce başladığını, üst üste gelip gelmediğini ve çakışmanın ne olduğunu belirlemeniz gerekir. Sorunuzu anlamak

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

"T1'lerin her zaman

+0

Haklısınız. Ayrıca ben (ve yukarıdaki cevaplar) örtüşme olduğu varsayılıyor. Bunun için de test etmeliyiz. – WombatPM

0

, aşağıdaki gibi iki tarih aralığını, üst üste gün sayısı için soruyorsun: Menzil 1 = 2010/01/01 Menzil 2 2010/02/01 için = Bu örnekte 2010-1-5 ila 2010-2-5 no.lı kesişen gün sayısı 28 gündür. İşte

İşte cevabı netleştirmek olabilir R. den bir örnek olduğunu örnek

 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

için bir kod örneğidir.

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)) 

Doğru, aksi halde yanlış olduklarını gösterir. [r]

8

Bunu hesaplamak için yazdığım küçük bir yöntem.

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

Harika, düz ileri çözüm. Benim için çalışıyor ve tüm testlerimi geçiyor. –

İlgili konular