2010-06-03 5 views

Répondre

5

Obtenir une nouvelle plage, définie par la plus récente des débuts et la plus ancienne des extrémités, et déterminer le nombre de jours depuis le début de l'époque pour chaque jour dans cette nouvelle plage.

La différence est le nombre de jours dans l'intersection. Accepter seulement des valeurs positives.

Modifié pour prendre en compte les plages au lieu des dates individuelles.

+0

Merci à tous pour vos commentaires ... Excellentes suggestions! Je n'avais pas réalisé que c'était si simple. – BoredOfBinary

0

La question demande entre deux plages de dates et non deux dates. (Edité en réponse aux commentaires)

Donc, si vous avez 2 gammes Date (r1s, R1e), vous devez déterminer qui commence d'abord, est-t-il chevauchement, et quel est le chevauchement.

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

"Supposons que T1s est toujours

+0

Vous avez raison. Aussi (et les réponses ci-dessus) supposons qu'il y a chevauchement. Nous devons tester cela aussi. – WombatPM

0

Si je comprends bien votre question, vous demandez le nombre de jours qui se chevauchent deux plages de dates, telles que: Range 1 = 2010-1-1 à 2010-2-1 Range 2 = 2010-1-5 à 2010-2-5 Dans cet exemple, le nombre de jours entrecroisés serait de 28 jours.

Voici un exemple de code pour cet exemple

 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

Voici un exemple de R. Cela pourrait clarifier la réponse.

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

vrai indiquerait qu'ils se croisent, Faux sinon. [r]

8

Voici une petite méthode que j'ai écrite pour le calculer.

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

Grande solution simple. Fonctionne pour moi et passe tous mes tests. –

Questions connexes