2013-06-25 18 views
9

Ich versuche eine IF-Prüfung durchzuführen, um zu sehen, ob der X-Datumsbereich zwischen dem Y-Datumsbereich liegt. Aber es ist nicht die richtige Rückkehr wahr/falsch auf die richtige Zeit:JavaScript-Datumsbereich zwischen dem Datumsbereich

var startdate = new Date('06/06/2013'); 
var enddate = new Date('06/25/2013'); 
var startD = new Date('06/08/2013'); 
var endD = new Date('06/18/2013'); 

if(startD >= startdate || endD <= enddate) { 
    return true; 
} else { 
    return false; 
} 

Dies funktioniert, aber wenn ich startdate-06/09/2013 ändern und enddate-06/17/2013 es nicht mehr funktioniert, während es funktionieren sollte.

Es sollte sogar funktionieren, wenn startdate war 06/07/2013 und enddate war 06/15/2013, aber nicht. Irgendwelche Gedanken?

+3

Versuchen Sie zu erkennen, ob sich die Datumsbereiche überlappen oder ob einer vollständig in einem anderen enthalten ist? – voithos

+1

Damit ein Datumsbereich eine Teilmenge eines anderen Datumsbereichs sein kann, muss der Anfang des inneren Bereichs nach dem Beginn des äußeren Bereichs liegen UND das Ende des inneren Bereichs muss vor dem Ende des äußeren Bereichs liegen. Möchten Sie überprüfen, ob ein Bereich einen anderen Bereich enthält, oder möchten Sie feststellen, ob sie sich überschneiden? – zzzzBov

+0

Beide und beide wirklich. Als ob das Enddatum innerhalb des Bereichs liegt, muss es aufgenommen werden, da sich einige Tage überschneiden. Wenn das Startdatum innerhalb des Bereichs liegt, aber das Enddatum ausbleibt, muss es immer noch wahr sein, da einige Tage immer noch innerhalb des Bereichs liegen. Also beides wirklich. – jfreak53

Antwort

22

Wenn Sie versuchen, vollständige Eindämmung zu erkennen, Das ist ziemlich einfach. (Auch Sie nicht die explizite return true/false müssen, weil die Bedingung ein boolean sowieso. Gerade sie zurückkehren)

// Illustration: 
// 
// startdate       enddate 
// v          v 
// #----------------------------------------# 
// 
//   #----------------------# 
//  ^     ^
//   startD    endD 
return startD >= startdate && endD <= enddate; 

Eine Überlappung Test ist etwas komplexer. Der folgende Wert gibt true zurück, wenn sich die beiden Datumsbereiche unabhängig von der Reihenfolge überschneiden.

// Need to account for the following special scenarios 
// 
// startdate  enddate 
// v    v 
// #----------------# 
// 
//   #----------------------# 
//  ^     ^
//   startD    endD 
// 
// or 
// 
//    startdate  enddate 
//     v    v 
//     #----------------# 
// 
//   #------------------# 
//  ^    ^
//  startD    endD 
return (startD >= startdate && startD <= enddate) || 
     (startdate >= startD && startdate <= endD); 

@ Antwort Bergi das ist wohl eher elegant, dass es nur die Start/End-Paare der beiden Datumsbereiche überprüft.

+0

Nun, wenn Sie Containment in Überlappung zulassen würde der Test viel einfacher sein ... – Bergi

+0

@ Bergi: Ich bin mir nicht ganz sicher, was Sie meinen, wenn Sie Containment zulassen würden - ich bin mir ziemlich sicher, dass dies immer noch "wahr" ist, wenn die Bereiche vollständig enthalten sind. Aber ich stimme zu, dass es eleganter ist, nach Start/Ende-Paaren zu suchen. – voithos

+3

Tipp: Vergleiche mit 'startD.getTime()' statt nur mit dem date -Objekt, da das date -Objekt zuerst in string konvertiert und als String verglichen wird, da getTime() ganzzahlige Werte vergleicht, die mehr als 10x schneller sind (in FF, 20x in Chrome) - natürlich nicht wichtig, es sei denn man muss viele Termine vergleichen. Nicht-wissenschaftlicher Test: http://jsperf.com/test-time-vs-gettime – K3N

10

In Ihrem Beispiel liegen die neuen Daten beide außerhalb des Bereichs.

Wenn Sie es überprüfen möchten, ob jede Überlappung zwischen den Datumsbereichen ist, verwenden:

return (endD >= startdate && startD <= enddate); 
+0

@voithos - Sehen, wie diese Antwort ist das gleiche wie Bergi, aber 2 Minuten früher, und ich bin gerade auf Wiederholungen ... – Bungus

12

Um zu überprüfen, ob sie mit irgendwelchen Tage überlappen, verwenden

if (endD >= startdate && startD <= enddate) 

das entspricht zu

if (!(endD < startdate || startD > enddate)) // not one after the other 
Verwandte Themen