2010-06-03 20 views

Odpowiedz

5

Uzyskaj nowy zakres, zdefiniowany przez późniejszy z początków i wcześniejszych końców, i określ liczbę dni od początku epoki dla każdego dnia w tym nowym zakresie.

Różnica polega na liczbie dni na przecięciu. Akceptuj tylko pozytywne wartości.

Edytowany w celu uwzględnienia zakresów zamiast poszczególnych dat.

+0

Dziękuję wszystkim za komentarze ... Wspaniałe sugestie! Nie zdawałem sobie sprawy, że to takie proste. – BoredOfBinary

0

Pytanie dotyczy dwóch zakresów dat, a nie dwóch dat. (Edytowane w odpowiedzi na komentarze)

Więc jeśli masz 2 zakresy dat (r1s, r1e), musisz określić, który z nich rozpoczyna się pierwszy, czy pokrywają się one i jakie są nakładające się wartości.

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

"Załóżmy, że T1s jest zawsze

+0

Masz rację. Również ja (i powyższe odpowiedzi) zakładamy, że się pokrywają. Musimy również przetestować to. – WombatPM

0

Jeśli rozumiem Twoje pytanie, prosisz o liczbie dni, które pokrywają się dwa zakresy dat, takich jak: Zakres 1 = 01.01.2010 do 01.02.2010 Zakres 2 = 2010-1-5 do 2010-2-5 w tym przykładzie liczba przecinających się dni wynosi 28 dni.

Oto przykładowy kod dla tego przykładu

 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

Oto przykład z R. To mogłoby wyjaśnić odpowiedź.

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

Prawda oznacza, że ​​przecinają się, Fałszywe w przeciwnym razie. [r]

8

Oto mała metoda, którą napisałem, aby to obliczyć.

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

Świetne, proste rozwiązanie. Działa dla mnie i przechodzi wszystkie moje testy. –

Powiązane problemy