2011-07-26 53 views
6

Digamos que tengo 2 rangos de fechas.intersección Timespan en C#

Esos rangos de fechas podrían representarse como intervalos de tiempo.

quiero encontrar un rango de fechas, que se encuentre dentro de los dos intervalos de tiempo.

Range 1: 2/1/2011 - 8/1/2011 (timespan of 6 months) 
Range 2: 5/2/2011 - 5/28/2011 (timespan of 26 days) 

por lo que en este caso, la intersección sería 5/2/2011-5/28/2011, pero los rangos podrían moverse en cualquier dirección, (o no se cortan en todo caso en el que me gustaría el lapso de tiempo resultante sea longitud 0)

al final, necesito las fechas del calendario de inicio/final del período de tiempo intersección resultante (no sólo las garrapatas/horas/días, etc)

¿hay una manera elegante hacer esto en C# 3.0?

ACTUALIZACIÓN

i tomó StriplingWarriors código y creó un método fuera de él ..

private static DateRange GetIntersectionRange(DateRange range1, DateRange range2) { 
     var iRange = new DateRange(); 
     iRange.From = range1.From < range2.From ? range2.From : range1.From; 
     iRange.To = range1.To < range2.To ? range1.To : range2.To; 
     if (iRange.From > iRange.To) iRange = null; 
     return iRange; 
    } 
+0

¿Necesita saber la fecha de inicio/finalización del rango, o simplemente su longitud? –

Respuesta

10

Algo como esto, tal vez?

var range1 = new{start = DateTime.Parse("2/1/2011"), end = DateTime.Parse("8/1/2011")}; 
var range2 = new{start = DateTime.Parse("5/2/2011"), end = DateTime.Parse("5/28/2011")}; 
var iStart = range1.start < range2.start ? range2.start : range1.start; 
var iEnd = range1.end < range2.end ? range1.end : range2.end; 
var newRange = iStart < iEnd ? new{start = iStart, end = iEnd} : null; 

Esto debería devolver null si no hay un período de tiempo de intersección.

+0

eso es lo suficientemente conciso, gracias :) –

0

La manera simple es deducir el tiempo de inicio del rango 1 con el tiempo de inicio del rango 2. Si el intervalo de tiempo es> 0, seleccione el rango 1 de inicio como fecha de inicio.

Haz lo mismo para la fecha de finalización del rango. Pero si el lapso de tiempo es> 0, seleccione la fecha de finalización del rango 2.

Luego compare los resultados si ambos son rangos válidos. Ie start < end. De lo contrario, no hay un rango válido.