2013-06-25 189 views
9

我試圖進行IF檢查以查看X日期範圍是否在Y日期範圍之間。但它沒有返回正確的真/假在正確的時間:日期範圍之間的JavaScript日期範圍

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; 
} 

這工作,但如果我改變startdate06/09/2013enddate06/17/2013它不再起作用,而它應該工作。

它甚至應該工作,如果startdate06/07/2013enddate06/15/2013,但沒有。有什麼想法嗎?

+3

您是否試圖檢測日期範圍是否重疊,或者是否完全包含在另一個範圍內? – voithos

+1

對於日期範圍是另一個日期範圍的子集,內部範圍的開始必須在外部範圍的開始之後,並且內部範圍的結束必須在外部範圍的結束之前。 你想檢查一個範圍是否包含另一個範圍,或者你想檢測它們是否重疊? – zzzzBov

+0

兩者都是真的。就好像enddate在需要包含的範圍內一樣,因爲有些日子會重疊。如果startdate在範圍內,但enddate熄滅,則仍然需要爲true,因爲幾天仍會在範圍內。所以都是真的。 – jfreak53

回答

22

如果您嘗試檢測完全遏制,這相當簡單。 (另外,你不需要明確return true/false,因爲條件是一個布爾值,反正,只要回到它)

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

的重疊測試稍微複雜一些。如果兩個日期範圍重疊,以下將返回true,無論順序如何。

// 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); 

@ Bergi的答案可能更優雅,因爲它只是檢查兩個日期範圍的開始/結束對。

+0

好吧,如果你允許遏制重疊測試會容易得多... – Bergi

+0

@ Bergi:我不完全確定你的意思是「如果你允許遏制」 - 我敢肯定,當範圍完全被包含時,這仍然會返回「true」。但我同意檢查起始/結束對更優雅。 – voithos

+3

提示:使用'startD.getTime()'而不是僅使用date對象進行比較,因爲使用date對象將首先轉換爲字符串並將其作爲字符串進行比較,因爲getTime()比較速度超過10倍的整數值(在FF中, Chrome中爲20倍) - 當然這並不重要,除非需要比較大量的日期。非科學測試:http://jsperf.com/test-time-vs-gettime – K3N

10

在你的例子中,新的日期都在範圍之外。

如果你想檢查是否有日期範圍之間的任何重疊使用:

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

@voithos - 看到這個答案和Bergi一樣,但是2分鐘前,我剛開始做代表...... – Bungus

12

要檢查,如果他們有任何日子重疊,使用

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

這相當於到

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