2013-06-25 5 views
9

Я пытаюсь проверить IF, чтобы увидеть, существует ли диапазон дат X между диапазоном дат Y. Но он никогда не возвращает правильную истину/лжи в правильное время:Диапазон дат в диапазоне дат

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

Это работает, но если я изменю startdate к 06/09/2013 и enddate к 06/17/2013 он больше не работает в то время как он должен работать.

Должен даже работать, если startdate был 06/07/2013 и enddate был 06/15/2013, но нет. Есть предположения?

+3

Вы пытаетесь определить, перекрываются ли диапазоны дат, или если они полностью содержатся внутри другого? – voithos

+1

Для диапазона дат, который должен быть подмножеством другого диапазона дат, начало внутреннего диапазона должно быть после начала внешнего диапазона, а конец внутреннего диапазона должен быть до конца внешнего диапазона. Вы хотите проверить, что один диапазон содержит другой в целом, или вы хотите определить, перекрываются ли они? – zzzzBov

+0

Оба и один действительно. Как будто enddate находится в пределах диапазона, который должен быть включен, поскольку некоторые дни будут перекрываться. Если startdate находится в пределах диапазона, но enddate выходит, это все равно должно быть правдой, поскольку через несколько дней все еще будет в пределах диапазона. Так и на самом деле. – 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); 

@ ответ BERĢI является, вероятно, более элегантным, в том, что он просто проверяет начало/конец пару два диапазонов дат.

+0

Ну, если вы позволите сдерживание в перекрытии теста будет намного проще ... – Bergi

+0

@ Берги: Я не совсем уверен, что вы подразумеваете под «если вы разрешите сдерживание» - я уверен, что это все равно возвращает «true», когда диапазоны полностью содержатся. Но я согласен, что более элегантно проверять пары начала и конца. – voithos

+3

Совет: сравните с помощью 'startD.getTime()' вместо объекта даты, так как использование объекта даты будет преобразовываться в строку сначала и сравнить как строку, поскольку getTime() сравнивает целочисленные значения, которые более чем в 10 раз быстрее (в FF, 20x в Chrome) - конечно, не жизненно важно, если вам не нужно сравнивать много дат. Ненаучный тест: http://jsperf.com/test-time-vs-gettime – K3N

10

В вашем примере новые даты находятся за пределами диапазона.

Если вы хотите, чтобы проверить, есть ли любого перекрытия между диапазонами дат, используйте:

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

@voithos - Увидев, что этот ответ такой же, как у Берги, но на 2 минуты раньше, и я только начинаю повторять ... – Bungus

12

Чтобы проверить, если они дублировали дни, используйте

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

что эквивалентно до

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