(DébutA <= FinB) et (FinA >= DébutB)
Preuve :
Que la ConditionA signifie que la DateRange A est complètement après la DateRange B
_ |---- DateRange A ------|
|---Date Range B -----| _
(Vrai si StartA > EndB
)
La condition B signifie que la plage de dates A est complètement antérieure à la plage de dates B.
|---- DateRange A -----| _
_ |---Date Range B ----|
(Vrai si EndA < StartB
)
Alors le chevauchement existe si ni A ni B n'est vrai -
(Si une gamme n'est ni complètement après l'autre,
ni complètement avant l'autre, alors ils doivent se chevaucher).
Maintenant, l'un des Les lois de Morgan dit cela :
Not (A Or B)
<=> Not A And Not B
Ce qui se traduit par : (StartA <= EndB) and (EndA >= StartB)
NOTE : Cela inclut les conditions où les bords se chevauchent exactement. Si vous souhaitez exclure cela,
changer le >=
les opérateurs à >
y <=
à <
NOTE2. Merci à @Baodad, voir ce blog le chevauchement réel est le moins élevé des deux :
{ endA-startA
, endA - startB
, endB-startA
, endB - startB
}
(StartA <= EndB) and (EndA >= StartB)
(StartA <= EndB) and (StartB <= EndA)
NOTE3. Grâce à @tomosius, une version plus courte se lit :
DateRangesOverlap = max(start1, start2) < min(end1, end2)
Il s'agit en fait d'un raccourci syntaxique pour une implémentation plus longue, qui comprend des contrôles supplémentaires pour vérifier que les dates de début sont égales ou antérieures aux dates de fin. Dérivant de ce qui précède :
Si les dates de début et de fin peuvent ne pas être dans l'ordre, c'est-à-dire s'il est possible que startA > endA
o startB > endB
il faut alors vérifier qu'ils sont dans l'ordre, ce qui signifie que vous devez ajouter deux règles de validité supplémentaires :
(StartA <= EndB) and (StartB <= EndA) and (StartA <= EndA) and (StartB <= EndB)
ou :
(StartA <= EndB) and (StartA <= EndA) and (StartB <= EndA) and (StartB <= EndB)
ou,
(StartA <= Min(EndA, EndB) and (StartB <= Min(EndA, EndB))
ou :
(Max(StartA, StartB) <= Min(EndA, EndB)
Mais pour mettre en œuvre Min()
y Max()
vous devez coder, (en utilisant le ternaire en C pour la tersité), :
(StartA > StartB? Start A: StartB) <= (EndA < EndB? EndA: EndB)
3 votes
Extrêmement similaire à stackoverflow.com/questions/306316/
1 votes
@CharlesBretana merci pour cela, vous avez raison - c'est presque comme une version bidimensionnelle de ma question !
2 votes
Très similaire à stackoverflow.com/questions/117962/
2 votes
Divisez la situation "les deux plages de dates se croisent" en plusieurs cas (il y en a deux), puis testez chaque cas.
0 votes
Je sais que ce sujet a été étiqueté comme étant agnostique en termes de langage, mais pour tous ceux qui implémentent en Java : Ne réinventez pas la roue et utilisez Joda Time. joda-time.sourceforge.net/api-release/org/joda/time/base/
0 votes
Si les dates peuvent être des valeurs NULL (ou vides), lorsqu'elles ne sont pas définies, il y a cette question qui est une extension de celle-ci.
0 votes
Fusionner les intervalles qui se chevauchent l'algorithme peut donner quelques pistes.
1 votes
Bonjour. A : StartDate1, B : EndDate1, C : StartDate2, D : EndDate2. Si B < C ou A > D alors nous supposons qu'ils ne sont pas intersectés . Donc, nous pouvons facilement tester avec " isintersects = not (B < C ou A > D) " cela nous donnera toujours si c'est intersecté ou non.
0 votes
Encore un autre utilitaire d'intervalle pour .Net github.com/AlexeyBoiko/IntervalUtility (Je suis l'auteur)