2010-06-03 11 views

Respuesta

5

Obtenga un nuevo rango, definido por el último de los comienzos y el anterior de los extremos, y determine el número de días desde el comienzo de la época para cada día en ese nuevo rango.

La diferencia es el número de días en la intersección. Acepta solo valores positivos

Editado para tener en cuenta los rangos en lugar de las fechas individuales.

+0

Gracias a todos por sus comentarios ... ¡Excelentes sugerencias! No me di cuenta de que era tan simple. – BoredOfBinary

0

La pregunta se realiza entre dos intervalos de fechas y no dos fechas. (editada en respuesta a los comentarios)

Así que si usted tiene 2 intervalos de fecha (R1S, R1e), es necesario determinar que se inicia en primer lugar, ¿Hay superponen, y lo que es la superposición.

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

"Supongamos que T1s siempre es

+0

Tienes razón. También I (y las respuestas anteriores) están asumiendo que hay superposición. Necesitamos probar eso también. – WombatPM

0

Si entiendo su pregunta, que está pidiendo el número de días que se superponen dos intervalos de tiempo, tales como: Rango 1 = 2010-1-1 a 02/01/2010 Rango 2 = 2010-1-5 a 2010-2-5 en este ejemplo, el número de días que se cruzan sería de 28 días.

Aquí es un ejemplo de código para ese ejemplo

 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

Este es un ejemplo de R. Eso podría aclarar la respuesta.

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

Verdadero indicaría que se cruzan, False en caso contrario. [r]

8

Aquí hay un pequeño método que escribí para calcular esto.

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

Solución genial y directa. Funciona para mí y pasa todas mis pruebas. –

Cuestiones relacionadas