2013-06-25 2 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; 
} 

이 작동하지만, 내가 06/09/2013startdate을 변경 한 경우 작동합니다 동안 enddate06/17/2013에 더 이상 작동 :하지만 정확한 시간에 정확한 참/거짓을 반환하지 아니에요.

startdate06/07/2013이고 enddate06/15/2013 인 경우에도 작동해야하지만 작동하지 않아야합니다. 이견있는 사람?

+3

날짜 범위가 중복되는지 아니면 다른 날짜 범위가 완전히 포함되어 있는지 감지하려고합니까? – voithos

+1

날짜 범위가 다른 날짜 범위의 하위 집합 인 경우 내부 범위의 시작이 외부 범위의 시작 뒤에 있어야하고 내부 범위의 끝이 외부 범위의 끝보다 커야합니다. 한 범위에 다른 범위가 전체적으로 포함되어 있는지 또는 중복 여부를 감지하려고합니까? – zzzzBov

+0

둘 중 하나와 둘 중 하나. enddate가 범위 내에있는 것처럼 몇 일 동안 포함되어야합니다. startdate가 범위 내에 있지만 enddate가 꺼지면 몇 일이 여전히 범위 내에 들기 때문에 여전히 true이어야합니다. 그래서 둘 다. – jfreak53

답변

22

전체 봉쇄를 감지하려는 경우, 그건 상당히 쉽습니다. 오버랩 테스트는 조금 더 복잡하다

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

(조건이 부울 어쨌든 때문에 또한, 당신은 명시 적 return true/false 필요하지 않습니다. 그냥 반환). 두 기간이 겹치는 경우 주문에 관계없이 다음은 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 : "봉쇄를 허용한다면"당신이 의미하는 것이 무엇인지 완전히 확신하지 못합니다. 범위가 완전히 포함될 때 여전히이 사실을 반환한다는 것이 확실합니다. 그러나 시작/끝 쌍을 확인하는 것이 더 우아하다는 데 동의합니다. – voithos

+3

팁 : date 객체 대신에 'startD.getTime()'을 사용하는 것이 좋습니다. 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