2011-07-26 6 views
6

Disons que j'ai 2 plages de dates.Intervalle de temps en C#

Ces plages de dates peuvent être représentées en tant que plages de temps.

Je veux trouver une plage de dates, qui tombe dans les deux intervalles de temps.

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

dans ce cas, l'intersection serait de 5/2/2011-5/28/2011, mais les plages peuvent se déplacer dans les deux sens, (recouper ou pas du tout dans ce cas, je voudrais le timespan résultant à 0 longueur)

à la fin, j'ai besoin les dates du calendrier de début/fin de la période de temps d'intersection résultant (pas seulement les tiques/heures/jours, etc.)

est-il une façon élégante faire cela dans C# 3.0?

MISE À JOUR

i pris le code StriplingWarriors et créé une méthode sur elle ..

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

Avez-vous besoin de connaître la date de début/fin de la gamme, ou simplement sa longueur? –

Répondre

10

Quelque chose comme ça, peut-être?

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; 

Cela devrait revenir null s'il n'y a pas de délai d'intersection.

+0

c'est assez concis, merci :) –

0

Une manière simple est de déduire l'heure de début de la plage 1 avec l'heure de début de la plage 2. Si l'intervalle de temps> 0, sélectionnez la plage 1 comme date de début.

Faites de même pour la date de fin de la plage. Mais si la durée est> 0, sélectionnez la date de fin de la plage 2.

Ensuite, comparez les résultats si les deux sont valides. C'est à dire commencer < fin. Sinon, il n'y a pas de plage valide.