JavaScript 날짜 개체 비교


86

Javascript에서 날짜 개체를 비교할 때 동일한 날짜를 비교해도 true가 반환되지 않는다는 것을 발견했습니다.

 var startDate1 = new Date("02/10/2012");
 var startDate2 = new Date("01/10/2012");
 var startDate3 = new Date("01/10/2012");
 alert(startDate1>startDate2); // true
 alert(startDate2==startDate3); //false

이 날짜의 동일성을 어떻게 비교할 수 있습니까? Date날짜를 비교하기 위해 타사 JS를 사용하는 것이 적절하지 않기 때문에 타사 라이브러리가 아닌 JS 의 기본 개체를 활용하는 데 관심 이 있습니다.


15
이것이 JavaScript에서 어떻게 잘못 설계되었는지에 대한 훌륭한 예입니다.
devios1 2012-12-02

답변:


131

두 번째 경우에는 실제 날짜 개체가 비교되고 두 개체가 서로 같지 않기 때문입니다. 번호를 강요하십시오.

 alert( +startDate2 == +startDate3 ); // true

보다 명시 적으로 숫자로 변환하려면 다음 중 하나를 사용하십시오.

 alert( startDate2.getTime() == startDate3.getTime() ); // true

또는

 alert( Number(startDate2) == Number(startDate3) ); // true

아, 사양에 대한 참조 : §11.9.3 기본적으로 객체를 비교할 때 말하는 추상 동등 비교 알고리즘obj1 == obj2 은 동일한 객체를 참조하는 경우에만 true이고 그렇지 않으면 결과는 false입니다.


5
@AndrewD. 이 특정 경우에 완전 같음을 사용하면 결과에 차이가 없습니다. 예의 같음 연산자는 항상 동일한 유형의 피연산자를 처리하고 @RobG는 값을 명시 적으로 Number로 변환하기 때문입니다 (예 1 및 3) 또는 예제 2에서는 Date.prototype.getTime항상 숫자를 반환 한다는 것을 알고 있습니다 ...
Christian C. Salvadó

12
참고로, 이러한 접근 방식 간에는 상당한 성능 차이가 있습니다. jsperf.com/date-equality-comparison
Nick Zalutskiy

2
@ Nick— 가장 느린 버전도 실행하는 데 1 마이크로 초 미만이 걸리므로 비교 차이가 있지만 절대적으로 성능 차이는 무시할 수 있습니다. OP는 가장 적합한 접근 방식을 선택해야 getTime합니다. 명확성을 위해 사용하는 것이 가장 좋습니다 (내가 테스트 한 브라우저에서도 가장 빠름).
RobG

2
@RobG 당신은 절대적으로 옳습니다. =) 나는 도서관을 쓰고 있었고 "그냥 사촌"이라는 테스트를했다. 실제 소프트웨어에서는 아무런 차이가 없습니다.
Nick Zalutskiy 2013 년

1
RobG

24

getTime()에포크 (즉, 숫자)에서 반환되는 밀리 초 수를 사용하여 날짜를 비교합니다 .

var startDate1 = new Date("02/10/2012");
var startDate2 = new Date("01/10/2012");
var startDate3 = new Date("01/10/2012");
alert(startDate1.getTime() > startDate2.getTime()); // true
alert(startDate2.getTime() == startDate3.getTime()); //true

또한 Date문자열 표현에 의존하는 대신 명시적인 연도 / 월 / 일 번호를 사용하는 생성자를 사용하는 것을 고려 하십시오 (참조 : Date.parse () ). 그리고 JavaScript의 날짜는 항상 클라이언트 (브라우저) 시간대를 사용하여 표시됩니다.


1
Date ()에 대한 인수로 문자열 사용에 대한 주석에 +1.
RobG 2011 년

16

getTime 메서드를 사용할 필요가 없습니다. 다른 날짜 개체에서 날짜 개체를 뺄 수 있습니다. 밀리 초 차이를 반환합니다 (초가 나중 날짜이면 음수).

var startDate1 = new Date("02/10/2012");
var startDate2 = new Date("01/10/2012");

var diff= (startDate1 -startDate2)

// 날짜의 타임 스탬프가 같으면 0으로 평가됩니다.


+1 간단하고 우아한, imo 선호 솔루션 : 숫자 타임 스탬프로 강제 할 필요없이 내장 된 날짜 평가 기능을 사용합니다
gdibble

5

실제 밀리 초를 비교할 수 있습니다.

alert(startDate2.getTime() === startDate3.getTime());

0

valueOf () 함수를 사용할 수도 있습니다.

 var startDate1 = new Date("02/10/2012").valueOf();
 var startDate2 = new Date("01/10/2012").valueOf();
 var startDate3 = new Date("01/10/2012").valueOf();
 alert(startDate1>startDate2); // 1326150000000 > 1328828400000   true
 alert(startDate2==startDate3); // 1328828400000 > 1326150000000  false
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.