2011-04-18 3 views
1

J'ai 4 dates startDate, endDate, periodStartDate, periodEndDateVérification des dates clapotis

Et je besoin d'une méthode pour revenir vrai si la période indiquée par le startDate et endDate la période de chevauchement désigné par le periodStartDate et periodEndDate.

Ceci est C# 3.5 donc impossible d'utiliser des tuples. comme le lien suggéré

Mon cerveau ne semble pas fonctionner alors quelqu'un peut m'aider s'il vous plaît.

Merci!

+0

dupliquer? http://stackoverflow.com/questions/4910617/multiple-date-range-comparison-for-overlap-how-to-do-it-efficiency – Dve

+0

Comment pourriez-vous l'expliquer à un humain, sans utiliser le mot "entre" ? Ecrivez-le exactement comme ça! ;-) – Achim

+0

Avez-vous trouvé l'une des réponses une autre? – Niklas

Répondre

1

En supposant que les dates de fin sera toujours égale ou plus tard que les dates de début:

return startDate <= periodEndDate; 
+0

Quoi? Que faire si startDate Zecc

+0

@Zecc - Il semblerait plutôt étrange si la logique permettait aux dates de fin de venir avant les dates de début. – ChaosPandion

+0

Période du 2011-01-01 au 2011-02-01, date du 2010-01-01 au 2010-02-01. Votre test retournera vrai, mais il est clair que les périodes ne se chevauchent pas. – mathieu

1

Il vous suffit de vérifier si le endDate est avant periodStartDate ou si le startDate est après la periodEndDate.
(En supposant que startDate < endDate et periodStartDate < periodEndDate)

Dans le code

if (endDate < periodStartDate || periodEndDate < startDate) return false; 
else return true; 

ou visuel =)

startDate -------- endDateperiodStartDate -------- periodEndDate

periodStartDate -------- periodEndDatestartDate -------- endDate

+0

Ceci est correct dans le négatif: si endDate <= periodStartDate, alors {start-> end} est avant {periodStart-> periodEnd}; si start> = periodStart, alors {start-> end} vient après {periodStart-> periodEnd}. Dans tous les autres cas, ils se chevauchent. – Zecc

+0

Je suppose qu'on pourrait se demander si les dates se chevauchent ou non si elles sont égales =) – Niklas

+0

En fait, j'ai mal compris la question et je vais la corriger. – Niklas

3
if (startDate<periodStartDate)//start date is older 
{ 

    if (periodStartDate < endDate) //if end date is later than start of period 
     return true; 
    else return false; // 
} 
else //period start is older 
{ 
    if (periodEndDate < startDate) //period ended before startdate 
     return false; 
    else 
     return true; 
} 

simplement prendre soin de l'endroit où vous voulez "<", et où "< ="

modifier (solution plus élégante):

if (end1<start2) || (end2<start1) return false 
else return true; 
1

Je pense que cela devrait faire ce que vous voulez.

{ 
      if (startDate < periodStartDate) 
      { 
       if (endDate>=periodStartDate) 
       { 
        return true; 
       } 
       else 
       { 
        return false; 
       }        
      } 
      else 
      { 
       if (startDate <= periodEndDate) 
       { 
        return true; 
       } 
       else 
       { 
        return false; 
       } 
      } 
     } 

Ceci permettra d'attraper le chevauchement même si une plage complète englobe l'autre.