JavaScript로 두 날짜 비교


1950

누군가가 JavaScript를 사용하여 과거보다 크거나 작거나 같지 않은 두 날짜 의 값을 비교하는 방법을 제안 할 수 있습니까 ? 텍스트 상자에서 값이 제공됩니다.


17
JS에서 DateTime 및 조작에 관해서는, 나는 momentjs 이상을 보지 않는다 :)
Halceyon

47
momentjs를 사용하여 두 날짜를 비교할 필요가 없습니다. 순수한 자바 스크립트의 Date 객체를 사용하십시오. 자세한 내용은 주요 답변을 확인하십시오.
Lukas Liesis 5

다음 답변을 참조 할 수 있습니다. stackoverflow.com/questions/4812152/… getDateDifference 및 getDifferenceInDays가 도움이되는지 확인하십시오.
Vikash Rajpurohit 10

나는 당신에게 Moment.js보다 더 멀리 볼 이유를 줄 것이다. ( 하지만 내가 좋아하는, 그러나 ... ) : 루핑로드에 사용하지 말라
Geek Stocks

시간 차이를 단위 (초, 분, 시간 등) 로 분리 하는 유용한 기능 에 대해서는 stackoverflow.com/questions/1968167/… 의 답변을 참조하십시오 . 이 답변은 이제 stackoverflow.com/a/46529159/3787376 에서도 사용할 수 있습니다 .
Edward

답변:


2284

Date 객체는 다음 각 날짜에 대한 구조 하나를 사용하여 비교 - 당신이 원하는 것을 할 것입니다 >, <, <=또는 >=.

==, !=, ===, 및 !==연산자를 사용하는 데 필요한 date.getTime()같이

var d1 = new Date();
var d2 = new Date(d1);
var same = d1.getTime() === d2.getTime();
var notSame = d1.getTime() !== d2.getTime();

날짜 개체와 직접 동등성을 확인하는 것이 명확하지 않습니다.

var d1 = new Date();
var d2 = new Date(d1);

console.log(d1 == d2);   // prints false (wrong!) 
console.log(d1 === d2);  // prints false (wrong!)
console.log(d1 != d2);   // prints true  (wrong!)
console.log(d1 !== d2);  // prints true  (wrong!)
console.log(d1.getTime() === d2.getTime()); // prints true (correct)

그러나 입력 유효성 검사 지옥에서 자신을 찾을 수 없도록 텍스트 상자 대신 드롭 다운 또는 유사한 제한된 형식의 날짜 항목을 사용하는 것이 좋습니다.


64
Ace의 방법조차도 안전하지 않습니다. 밀리 초를 먼저 재설정해야하며 전체 시간을 재설정 할 수도 있습니다. date1.setHours (0); date1.setMinutes (0); date1.setSeconds (0); date1.setMilliseconds (0); .getTime를 사용하여 결합 된 것을 () 당신에게 정확한 비교 결과를 줄 것이다
패트릭

102
@ 패트릭, setHours(0,0,0,0)이런 식으로 전화를 제안 합니다. 전화 할 필요가 없습니다 setMinutes(). 또한 더 빠르게 실행됩니다.
Karl

26
원하는 결과를 얻으려면 == 또는 === 피하십시오 : jsfiddle.net/P4y5J now> = anotherNow && now <= anotherNow IS FYI
Jason Sebring

5
toString()두 날짜 모두에 방법을 사용 하고 ==연산자 와 비교해 보지 않겠 습니까? 시간을 재설정하고 나중에 비교하는 것보다 훨씬 쉬운 것 같습니다. 이것에 대한 단점이 있습니까?
user2019515

13
객체 자체를 비교하지 않기 위해 날짜의 숫자 값을 비교할 수도 있습니다. date1.valueOf () == date2.valueOf ()
madprog

421

자바 스크립트에서 날짜를 비교하는 가장 쉬운 방법은 먼저 날짜를 Date 객체로 변환 한 다음이 날짜 객체를 비교하는 것입니다.

아래에는 세 가지 기능이있는 객체가 있습니다.

  • 날짜 비교 (a, b)

    숫자를 반환합니다 :

    • a <b 인 경우 -1
    • a = b이면 0
    • a> b 인 경우 1
    • a 또는 b가 불법 날짜 인 경우 NaN
  • dates.inRange (d, 시작, 종료)

    부울 또는 NaN을 반환합니다.

    • 만약에 사실 이라면d시작 사이에 (포함)
    • 그릇된d시작 전 이나 끝인 경우 입니다.
    • 하나 이상의 날짜가 불법 인 경우 NaN
  • 날짜. 변환

    다른 함수에서 입력을 날짜 객체로 변환하는 데 사용됩니다. 입력은

    • 날짜 -object은 : 입력은있는 그대로 반환됩니다.
    • 배열 : 년, 월, 일]로 해석. 참고 월은 0-11입니다.
    • 번호 : 1970년 1월 1일 (타임 스탬프) 이후의 밀리 초 수로 해석
    • 문자열 : 몇 가지 다른 포맷 등 "YYYY / MM / DD", "MM / DD / YYYY", "2009년 1월 31일"처럼 지원
    • 객체 : 년, 월, 날짜 속성을 가진 개체로 해석. 참고 월은 0-11입니다.

.

// Source: http://stackoverflow.com/questions/497790
var dates = {
    convert:function(d) {
        // Converts the date in d to a date-object. The input can be:
        //   a date object: returned without modification
        //  an array      : Interpreted as [year,month,day]. NOTE: month is 0-11.
        //   a number     : Interpreted as number of milliseconds
        //                  since 1 Jan 1970 (a timestamp) 
        //   a string     : Any format supported by the javascript engine, like
        //                  "YYYY/MM/DD", "MM/DD/YYYY", "Jan 31 2009" etc.
        //  an object     : Interpreted as an object with year, month and date
        //                  attributes.  **NOTE** month is 0-11.
        return (
            d.constructor === Date ? d :
            d.constructor === Array ? new Date(d[0],d[1],d[2]) :
            d.constructor === Number ? new Date(d) :
            d.constructor === String ? new Date(d) :
            typeof d === "object" ? new Date(d.year,d.month,d.date) :
            NaN
        );
    },
    compare:function(a,b) {
        // Compare two dates (could be of any type supported by the convert
        // function above) and returns:
        //  -1 : if a < b
        //   0 : if a = b
        //   1 : if a > b
        // NaN : if a or b is an illegal date
        // NOTE: The code inside isFinite does an assignment (=).
        return (
            isFinite(a=this.convert(a).valueOf()) &&
            isFinite(b=this.convert(b).valueOf()) ?
            (a>b)-(a<b) :
            NaN
        );
    },
    inRange:function(d,start,end) {
        // Checks if date in d is between dates in start and end.
        // Returns a boolean or NaN:
        //    true  : if d is between start and end (inclusive)
        //    false : if d is before start or after end
        //    NaN   : if one or more of the dates is illegal.
        // NOTE: The code inside isFinite does an assignment (=).
       return (
            isFinite(d=this.convert(d).valueOf()) &&
            isFinite(start=this.convert(start).valueOf()) &&
            isFinite(end=this.convert(end).valueOf()) ?
            start <= d && d <= end :
            NaN
        );
    }
}

11
(a > b) - (a < b)날짜 배열을 정렬하는 데 유용합니다
nktssh

@nikita 예, 그 값을 반환하는 함수는 Array.prototype.sort모든 값이 유효한 날짜이면 사용할 수 있습니다 . 잘못된 날짜가있을 수 있다면, 나는 같은 것을 사용하는 것이 좋습니다function ( a, b ) { a = a === undefined || a === null : NaN : a.valueOf( a ); b = a === undefined || b === null : NaN : a.valueOf( b ); return isFinite( a ) && isFinite( b ) ? ( a > b ) - ( a < b ) : NaN; }
일부

4
@ nktssh— 아마도 return a - b더 단순하고 전체 return 문을 대체합니다.
RobG

284

평소 <>같이 비교 하지만 접두사를 =사용해야 +합니다. 이렇게 :

var x = new Date('2013-05-23');
var y = new Date('2013-05-23');

// less than, greater than is fine:
x < y; => false
x > y; => false
x === y; => false, oops!

// anything involving '=' should use the '+' prefix
// it will then compare the dates' millisecond values
+x <= +y;  => true
+x >= +y;  => true
+x === +y; => true

도움이 되었기를 바랍니다!


81
정말 느린 :) 내가 선호하는 x.getTime() === y.getTime()방법은, 모두 읽고 매우 빠른 볼 jsperf
huysentruitw

24
+연산자는 숫자로 표현을 변환하려고 시도합니다. Date.valueOf()는 변환에 사용됩니다 (와 동일한 것을 반환합니다 Date.getTime().
Salman A

13
@WouterHuysentruit 둘 다 매우 빠릅니다 (가장 느린 브라우저에서 3 백만 OPS). 더 읽기 쉬운 방법을 사용하십시오
Eloims

13
참고 관련된 아무것도 '='는 '+'접두사 사용해야 답변의 일부가 잘못되었습니다. <, <=, >>=같은 알고리즘 (사용 추상적 인 관계 비교 알고리즘 배후를).
Salman A

2
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 귀하의 답변 덕분에 직장에서 개발 한 서비스에는 추적하기 어려운 끔찍한 버그가있었습니다.
이규현

157

관계 연산자 < <= > >=를 사용하여 JavaScript 날짜를 비교할 수 있습니다.

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 2);
d1 <  d2; // true
d1 <= d2; // true
d1 >  d2; // false
d1 >= d2; // false

그러나 항등 연산자 == != === !==는 다음과 같은 이유로 날짜 값을 비교하는 데 사용할 수 없습니다 .

  • 엄격하거나 추상적 인 비교를 위해 두 개의 별개의 객체가 동일하지 않습니다.
  • 피연산자가 동일한 객체를 참조하는 경우에만 객체를 비교하는 표현식이 참입니다.

다음 방법 중 하나를 사용하여 평등 날짜 값을 비교할 수 있습니다.

var d1 = new Date(2013, 0, 1);
var d2 = new Date(2013, 0, 1);
/*
 * note: d1 == d2 returns false as described above
 */
d1.getTime() == d2.getTime(); // true
d1.valueOf() == d2.valueOf(); // true
Number(d1)   == Number(d2);   // true
+d1          == +d2;          // true

모두 Date.getTime()Date.valueOf()1970 년 1 월 1 일 00:00 (UTC)부터 (밀리 초)을 반환합니다. Number함수와 단항 +연산자는 모두 valueOf()뒤에서 메소드를 호출합니다 .


String을 Date 객체로 변환하는 것이 안전합니까? 예외를 던지거나 신뢰할 수없는 결과를 줄 수 없습니까? JS에서 날짜를 확인하는 가장 신뢰할 수있는 방법은 무엇입니까? 신뢰할 수없는 결과를 말할 때이 방법으로 날짜 형식이 변경되지 않을 것이라고 확신 할 때도 다른 값을 제공 할 수 있습니까?> "2017 년 8 월 10 일 목요일" 귀하의 도움은 대단히 감사합니다.
user2696258

다른 OS / 브라우저 / 장치에서 동일한 날짜 값에 신뢰할 수없는 결과를 제공 할 수 있습니까?
user2696258

1
@ user2696258 이것은 두 Date 객체 를 비교하는 가장 신뢰할 수있는 방법입니다 . 문자열을 날짜로 변환하는 것은 다른 문제입니다 ... 날짜 구문 분석 라이브러리를 사용하거나 자신의 솔루션을 굴리십시오. Thursday, 10 Aug 2017비표준 형식이며 브라우저마다 다르게 구문 분석하거나 전혀 구문 분석하지 않을 수 있습니다. 에 대한 참고 사항을 참조하십시오 Date.parse.
Salman A

88

지금까지 가장 쉬운 방법은 한 날짜를 다른 날짜에서 빼고 결과를 비교하는 것입니다.

var oDateOne = new Date();
var oDateTwo = new Date();

alert(oDateOne - oDateTwo === 0);
alert(oDateOne - oDateTwo < 0);
alert(oDateOne - oDateTwo > 0);


68

JavaScript에서 날짜 를 비교하는 것은 매우 쉽습니다 ... JavaScript에는 날짜에 대한 비교 시스템 이 내장 되어 있습니다 를 되어있어 비교하기가 쉽습니다 ...

두 날짜 값을 비교하려면 다음 단계를 따르십시오. 예를 들어 각각 날짜 값이있는 2 개의 입력이 있습니다. String 비교할 수 있습니다 ...

1. 입력에서 얻은 2 개의 문자열 값이 있으며 비교하려는 경우 다음과 같습니다.

var date1 = '01/12/2018';
var date2 = '12/12/2018';

2.Date Object 날짜 값으로 비교 해야 하므로 간단히 new Date()설명하기 위해을 사용하여 날짜로 변환하면됩니다. 설명을 간단하게하기 위해 다시 할당하지만 원하는대로 할 수 있습니다.

date1 = new Date(date1);
date2 = new Date(date2);

3. 이제 단순히> < >= <=

date1 > date2;  //false
date1 < date2;  //true
date1 >= date2; //false
date1 <= date2; //true

자바 스크립트에서 날짜를 비교


날짜 비교를위한 대부분의 솔루션은 모든 브라우저에서 작동한다는 것을 알았습니다. 내가 경험 한 문제는 IE와 관련이 있습니다. 이 솔루션은 전반적으로 작동했습니다. Thx Alireza!
Joshua Oglesbee

2
작동하지 않습니다. 그리고 작동하지 않아야합니다. 날짜 개체를 비교하고 있습니다.
maxisam

3
아니 @maxisam,이 때문에 비교 연산자의 작업을 수행 ( <, >, <=, >=) 날짜 개체는 유닉스 시대 (초)로 먼저 변환하고, 그것을 잘 작동되어 사용된다. 그러나 이것은 date1 == date2실제로 오류가 값이 아닌 인스턴스 동일성을 검사 하는 위치 에서 수행하는 일반적인 실수로 이어질 수 있습니다 . 이를 방지 및 날짜 값의 평등을 확인하려면이 작동합니다 : date1.valueOf() == date2.valueOf(), 또는 짧은date1+0 == date2+0
humanityANDpeace

에서 참고 MDN Note: Parsing of strings with Date.parse is strongly discouraged due to browser differences and inconsistencies.Note: Parsing of date strings with the Date constructor (and Date.parse, they are equivalent) is strongly discouraged due to browser differences and inconsistencies.
AAA

35

요일 만 비교 (시간 구성 요소 무시) :

Date.prototype.sameDay = function(d) {
  return this.getFullYear() === d.getFullYear()
    && this.getDate() === d.getDate()
    && this.getMonth() === d.getMonth();
}

용법:

if(date1.sameDay(date2)) {
    // highlight day on calendar or something else clever
}

이것은 좋다. 그러나 nextDay 또는 previousDay를 비교하면 어떻게됩니까? 나는 이것을 시도했다 Date.prototype.nextDay = function (d) {return this.getFullYear () === d.getFullYear () && this.getDate () <d.getDate () && this.getMonth () === d .getMonth (); } Date.prototype.previousDay = function (d) {return this.getFullYear () === d.getFullYear () && this.getDate ()> d.getDate () && this.getMonth () === d.getMonth 반환 (); } 그러나 이번 달에만 작동합니다. 몇 달 또는 몇 년에 걸쳐 어떻게 비교
Paresh3489227

32

어떤 형식입니까?

Javascript Date 객체 를 구성하는 경우 밀리 초 차이를 얻기 위해 빼기 만하면됩니다 (편집 : 또는 비교).

js>t1 = new Date()
Thu Jan 29 2009 14:19:28 GMT-0500 (Eastern Standard Time)
js>t2 = new Date()
Thu Jan 29 2009 14:19:31 GMT-0500 (Eastern Standard Time)
js>t2-t1
2672
js>t3 = new Date('2009 Jan 1')
Thu Jan 01 2009 00:00:00 GMT-0500 (Eastern Standard Time)
js>t1-t3
2470768442
js>t1>t3
true

1
빼기는 ==위에 언급 된 비교 문제를 피하기 때문에 좋은 생각 입니다.
devios1

어떤 JavaScript REPL을 사용하고 있습니까?
hyde

JSDB은 - 볼 jsdb.org을 내가 파이썬은 선택의 내 언어입니다 지금은 덜 자주 이러한 일을 사용하지만, 여전히 좋은 유틸리티입니다 -.
Jason S

1
@ StuartP.Bentley 나는 그것들을 사용하지 않기 때문에 모른다. jsdb를 사용합니다.
Jason S

많은 양의 날짜를 겪을 때 getTime ()으로 변환 할 필요가 없으므로 가장 효율적으로 보입니다.
pcarvalho

16

이 코드를 사용하면

var firstValue = "2012-05-12".split('-');
var secondValue = "2014-07-12".split('-');

 var firstDate=new Date();
 firstDate.setFullYear(firstValue[0],(firstValue[1] - 1 ),firstValue[2]);

 var secondDate=new Date();
 secondDate.setFullYear(secondValue[0],(secondValue[1] - 1 ),secondValue[2]);     

  if (firstDate > secondDate)
  {
   alert("First Date  is greater than Second Date");
  }
 else
  {
    alert("Second Date  is greater than First Date");
  }

또한이 링크를 확인하십시오 http://www.w3schools.com/js/js_obj_date.asp


3
W3Schools를 언급하지 않는 이유 : w3fools.com- 좋은 해결책-표준을 준수하며 모든 브라우저에서 작동합니까?
Mathias Lykkegaard Lorenzen

1
Mozilla 개발자 네트워크 : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…를 참조하십시오 .
Daniel Lidström 2016 년

16

짧은 답변

다음은 from dateTime> to dateTime Demo가 작동 하는 경우 {boolean}을 반환하는 함수입니다.

var from = '08/19/2013 00:00'
var to = '08/12/2013 00:00 '

function isFromBiggerThanTo(dtmfrom, dtmto){
   return new Date(dtmfrom).getTime() >=  new Date(dtmto).getTime() ;
}
console.log(isFromBiggerThanTo(from, to)); //true

설명

jsFiddle

var date_one = '2013-07-29 01:50:00',
date_two = '2013-07-29 02:50:00';
//getTime() returns the number of milliseconds since 01.01.1970.
var timeStamp_date_one = new Date(date_one).getTime() ; //1375077000000 
console.log(typeof timeStamp_date_one);//number 
var timeStamp_date_two = new Date(date_two).getTime() ;//1375080600000 
console.log(typeof timeStamp_date_two);//number 

이제 숫자 유형의 날짜 시간이 모두 있으므로 비교 작업과 비교할 수 있습니다

(>, <, =,! =, ==,! ==,> = AND <=)

그때

C#사용자 정의 날짜 및 시간 형식 문자열에 익숙한 경우이 라이브러리는 정확히 동일한 작업을 수행하고 날짜 시간 문자열 또는 유닉스 형식으로 전달하는지 여부에 관계없이 날짜 및 시간 dtmFRM의 형식을 지정하는 데 도움이 됩니다.

용법

var myDateTime = new dtmFRM();

alert(myDateTime.ToString(1375077000000, "MM/dd/yyyy hh:mm:ss ampm"));
//07/29/2013 01:50:00 AM

alert(myDateTime.ToString(1375077000000,"the year is yyyy and the day is dddd"));
//this year is 2013 and the day is Monday

alert(myDateTime.ToString('1/21/2014', "this month is MMMM and the day is dd"));
//this month is january and the day is 21

데모

라이브러리 js파일 에서 작성된 이러한 형식 중 하나를 전달하기 만하면 됩니다.


new Date (dtmfrom)> = new Date (dtmto)는 new Date (dtmfrom) .getTime ()> = new Date (dtmto) .getTime ()보다 훨씬 느리다
Mina Gabriel

아마도 브라우저에 따라 차이는 작업 당 약 30-120 나노초 (즉, 0.000000075 초)이기 때문에 실제로 중요하지는 않습니다.
RobG

15

간단한 방법은

var first = '2012-11-21';
var second = '2012-11-03';

if (new Date(first) > new Date(second) {
    .....
}

14

참고-날짜 부분 만 비교 :

우리가 자바 스크립트에서 두 날짜를 비교할 때. 시간, 분 및 초도 고려됩니다. 따라서 날짜 만 비교해야하는 경우 다음과 같은 방법입니다.

var date1= new Date("01/01/2014").setHours(0,0,0,0);

var date2= new Date("01/01/2014").setHours(0,0,0,0);

지금 : if date1.valueOf()> date2.valueOf()매력처럼 작동합니다.


13
function datesEqual(a, b)
{
   return (!(a>b || b>a))
}

1
그들은 a 또는 b의 유형은 무엇입니까? 데이트? 어떤 형식입니까? 이것은 나와 함께 작동하지 않는 것 같습니다.
Luci

5
가정 a하고 b있는 것은 Date당신은 또한 사용할 수 있습니다 객체return a*1 == b*1;
우도 G

4
@UdoG : 짧게 :+a == +b
mpen

13
var date = new Date(); // will give you todays date.

// following calls, will let you set new dates.
setDate()   
setFullYear()   
setHours()  
setMilliseconds()   
setMinutes()    
setMonth()  
setSeconds()    
setTime()

var yesterday = new Date();
yesterday.setDate(...date info here);

if(date>yesterday)  // will compare dates

11

많은 기존 옵션에 또 다른 가능성을 추가하기 위해 시도해 볼 수 있습니다.

if (date1.valueOf()==date2.valueOf()) .....

... 나에게 도움이되는 것 같습니다. 물론 두 날짜가 모두 정의되지 않았는지 확인해야합니다 ...

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():0) .....

이런 식으로 우리는 둘 다 정의되지 않은 경우 긍정적 인 비교가 이루어 지도록 할 수 있습니다.

if ((date1?date1.valueOf():0)==(date2?date2.valueOf():-1) .....

... 평등하지 않은 것을 선호한다면.


11

Via Moment.js

JSfiddle : http://jsfiddle.net/guhokemk/1/

function compare(dateTimeA, dateTimeB) {
    var momentA = moment(dateTimeA,"DD/MM/YYYY");
    var momentB = moment(dateTimeB,"DD/MM/YYYY");
    if (momentA > momentB) return 1;
    else if (momentA < momentB) return -1;
    else return 0;
}

alert(compare("11/07/2015", "10/07/2015"));

dateTimeA보다 큰 경우 메소드는 1을 리턴합니다.dateTimeB

이 메서드는 dateTimeA같으면 0을 반환합니다.dateTimeB

dateTimeA이보다 작 으면 -1을 반환합니다.dateTimeB


3
Date객체에 대한 날짜 비교를 수행하기 위해 Moment와 같은 외부 라이브러리를 사용할 필요가 없습니다 .
amb

내 유스 케이스에는 순간이 절대적으로 필요했습니다. 감사합니다, 라잔!
razorsyntax

1
왜 당신은 심지어 사용 <또는 >사업자 순간 이미 같은 편리한 비교 방법과 때 .isBefore.isAfter, 그것은 모두의 문서
svarog

10

타임 존이되기 전에

자바 스크립트 날짜에는 시간대 개념없습니다 . "현지"시간대의 문자열을주고받는 편리한 기능을 갖춘 순간 (에포크 이후의 틱)입니다. 날짜 객체를 사용하여 날짜로 작업하려는 경우 모든 사람이하는 것처럼 날짜가 해당 날짜의 시작 부분에 UTC 자정을 나타내기를 원합니다.이것은 생성의 계절이나 시간대에 관계없이 날짜로 작업 할 수있게하는 일반적이고 필요한 규칙입니다. 따라서 특히 자정 UTC Date 객체를 만들 때 시간대 개념을 관리하려면 매우주의해야합니다.

대부분의 경우, 날짜는 사용자의 시간대를 반영하기를 원할 것입니다. 오늘이 생일이라면 클릭하십시오 . NZ와 미국 사용자는 동시에 클릭하여 다른 날짜를 얻습니다. 이 경우, 이렇게하십시오 ...

// create a date (utc midnight) reflecting the value of myDate and the environment's timezone offset.
new Date(Date.UTC(myDate.getFullYear(),myDate.getMonth(), myDate.getDate()));

때로는 국제 비교가 지역 정확도보다 우월합니다. 이 경우, 이렇게하십시오 ...

// the date in London of a moment in time. Device timezone is ignored.
new Date(Date.UTC(myDate.getUTCYear(), myDate.getyUTCMonth(), myDate.getUTCDate()));

이제 다른 답변에서 제안하는 것처럼 날짜 개체를 직접 비교할 수 있습니다.

시간대를 만들 때주의를 기울인 후에는 문자열 표현으로 다시 변환 할 때 시간대를 유지해야합니다. 안전하게 사용할 수 있습니다 ...

  • toISOString()
  • getUTCxxx()
  • getTime() //returns a number with no time or timezone.
  • .toLocaleDateString("fr",{timezone:"UTC"}) // whatever locale you want, but ALWAYS UTC.

그리고 다른 모든 것을 특히 피하십시오.

  • getYear(), getMonth(),getDate()

8

날짜 개체 A와 B를 가져 와서 EPOC 시간 값을 얻은 다음 빼서 밀리 초 단위의 차이를 얻으십시오.

var diff = +A - +B;

그게 다야.


8

두 날짜를 비교하기 위해 다음 사이트에서 date.js JavaScript 라이브러리를 사용할 수 있습니다 : https://code.google.com/archive/p/datejs/downloads

Date.compare( Date date1, Date date2 )메소드를 사용하면 다음 결과를 의미 하는 숫자 를 반환합니다 .

-1 = date1이 date2보다 작습니다.

0 = 값이 같습니다.

1 = date1이 date2보다 큽니다.


8

두 날짜를 빼면 밀리 초 단위의 차이를 얻습니다. 0 동일한 날짜가 습니다.

function areSameDate(d1, d2){
    return d1 - d2 === 0
}

7

Javascript에서 자유 텍스트로 날짜를 작성하려면 Date () 객체로 구문 분석해야합니다.

자유 텍스트를 사용하여 Date.parse ()를 사용하여 새 날짜로 변환하려고 시도 할 수 있지만 페이지를 제어 할 수 있다면 대신 HTML 선택 상자 또는 YUI 달력 컨트롤 또는 jQuery UI 와 같은 날짜 선택기를 사용하는 것이 좋습니다 날짜 선택기 .

다른 사람들이 지적한 것처럼 날짜가 있으면 간단한 산술을 사용하여 날짜를 빼고 숫자 (초)를 하루의 초 수 (60 * 60 *)로 나눠서 날짜 수로 다시 변환 할 수 있습니다. 24 = 86400).


6
var date_today=new Date();
var formated_date = formatDate(date_today);//Calling formatDate Function

var input_date="2015/04/22 11:12 AM";

var currentDateTime = new Date(Date.parse(formated_date));
var inputDateTime   = new Date(Date.parse(input_date));

if (inputDateTime <= currentDateTime){
    //Do something...
}

function formatDate(date) {
    var hours = date.getHours();
    var minutes = date.getMinutes();
    var ampm = hours >= 12 ? 'PM' : 'AM';

    hours = hours % 12;
    hours = hours ? hours : 12; // the hour '0' should be '12'
    hours   = hours < 10 ? '0'+hours : hours ;

    minutes = minutes < 10 ? '0'+minutes : minutes;

    var strTime = hours+":"+minutes+ ' ' + ampm;
    return  date.getFullYear()+ "/" + ((date.getMonth()+1) < 10 ? "0"+(date.getMonth()+1) :
    (date.getMonth()+1) ) + "/" + (date.getDate() < 10 ? "0"+date.getDate() :
    date.getDate()) + " " + strTime;
}

5

"some"에 의해 게시 된 코드의 개선 된 버전

/* Compare the current date against another date.
 *
 * @param b  {Date} the other date
 * @returns   -1 : if this < b
 *             0 : if this === b
 *             1 : if this > b
 *            NaN : if a or b is an illegal date
*/ 
Date.prototype.compare = function(b) {
  if (b.constructor !== Date) {
    throw "invalid_date";
  }

 return (isFinite(this.valueOf()) && isFinite(b.valueOf()) ? 
          (this>b)-(this<b) : NaN 
        );
};

용법:

  var a = new Date(2011, 1-1, 1);
  var b = new Date(2011, 1-1, 1);
  var c = new Date(2011, 1-1, 31);
  var d = new Date(2011, 1-1, 31);

  assertEquals( 0, a.compare(b));
  assertEquals( 0, b.compare(a));
  assertEquals(-1, a.compare(c));
  assertEquals( 1, c.compare(a));

아마도 a 는 메소드가 호출 된 Date 인스턴스입니다. 어떤 경우에는 수 a는 잘못된 날짜 수 있지만 아직 날짜 인스턴스가?
RobG

5

다음이 날짜 형식 인 경우이 코드를 사용할 수 있습니다.

var first = '2012-11-21';
var second = '2012-11-03';
if(parseInt(first.replace(/-/g,""),10) > parseInt(second.replace(/-/g,""),10)){
   //...
}

20121121숫자가 큰지 여부를 확인합니다 20121103.


4
이미 ISO8601 형식 (YYYY-MM-DD) 인 경우 문자를 제거하거나 정수로 변환 할 필요가 없습니다. 문자열 first == second또는 first < second또는을 비교하십시오 first > second. MM / DD / YY, DD / MM / YY, YY / DD / MM, DD / YY / MM 또는 MM / YY / DD와 비교할 때 ISO8601의 많은 아름다움 중 하나입니다.

5

나는 보통 데이터베이스 Dates와 같이 저장 timestamps(Number)합니다.

비교해야 할 때 해당 타임 스탬프 또는

Date Object로 변환 한 다음 > <필요한 경우 비교 하십시오.

변수가 동일한 날짜 개체에 대한 참조가 아니면 == 또는 ===가 제대로 작동하지 않습니다.

해당 Date 객체를 먼저 timestamp (number)로 변환 한 다음 동일한 지 비교하십시오.


타임 스탬프 날짜

var timestamp_1970 = new Date(0).getTime(); // 1970-01-01 00:00:00
var timestamp = new Date().getTime(); // Current Timestamp

타임 스탬프부터 날짜까지

var timestamp = 0; // 1970-01-01 00:00:00
var DateObject = new Date(timestamp);

이것이 가장 좋은 답변이며 가장 빠른 jsperf.com/comparing-date-objects
Scott Stensland

3

Dates객체를 비교하기 전에 밀리 초를 모두 0으로 설정하십시오 Date.setMilliseconds(0);.

다음은 몇 가지 경우에 Date당신이 인쇄를 계속 사용하면 객체가 동적으로 자바 스크립트에서 생성 Date.getTime(), 당신은 두 날짜의 평등을 방지 할 수있는 밀리 세컨드 변화가 나타납니다.


3

공연

오늘 2020.02.27 MacOs High Sierra v10.13.6에서 Chrome v80.0, Safari v13.0.5 및 Firefox 73.0.1에서 선택한 솔루션의 테스트를 수행합니다.

결론

  • 솔루션 d1==d2(D) 및 d1===d2(E)는 모든 브라우저에서 가장 빠릅니다.
  • 솔루션 getTime(A)가 valueOf(B) 보다 빠릅니다 (둘 다 보통 빠름)
  • 솔루션 F, L, N은 모든 브라우저에서 가장 느립니다.

여기에 이미지 설명을 입력하십시오

세부

아래는 성능 테스트에 사용 된 스 니펫 솔루션입니다. 당신은 여기 당신의 기계에서 테스트를 수행 할 수 있습니다

크롬에 대한 결과

여기에 이미지 설명을 입력하십시오


그러나 d1==d2또는 d1===d2질문의 맥락에서 쓸모가 없다.
TheMaster

1
        from_date ='10-07-2012';
        to_date = '05-05-2012';
        var fromdate = from_date.split('-');
        from_date = new Date();
        from_date.setFullYear(fromdate[2],fromdate[1]-1,fromdate[0]);
        var todate = to_date.split('-');
        to_date = new Date();
        to_date.setFullYear(todate[2],todate[1]-1,todate[0]);
        if (from_date > to_date ) 
        {
            alert("Invalid Date Range!\nStart Date cannot be after End Date!")

            return false;
        }

이 코드를 사용하여 javascript를 사용하여 날짜를 비교하십시오.

감사합니다 D.Jeeva


우리는 "dd / mm / yy"형식을 가지고 있기 때문에 이것이 좋은 대답이라고 생각합니다. 두 날짜를 비교하기 위해해야합니다. 그것이 최선의 대답인지는 모르겠지만 충분합니다. 공유해 주셔서 감사합니다.
danigonlinea 2016 년

1
var curDate=new Date();
var startDate=document.forms[0].m_strStartDate;

var endDate=document.forms[0].m_strEndDate;
var startDateVal=startDate.value.split('-');
var endDateVal=endDate.value.split('-');
var firstDate=new Date();
firstDate.setFullYear(startDateVal[2], (startDateVal[1] - 1), startDateVal[0]);

var secondDate=new Date();
secondDate.setFullYear(endDateVal[2], (endDateVal[1] - 1), endDateVal[0]);
if(firstDate > curDate) {
    alert("Start date cannot be greater than current date!");
    return false;
}
if (firstDate > secondDate) {
    alert("Start date cannot be greater!");
    return false;
}

1

여기 내 프로젝트 중 하나에서 수행 한 작업이 있습니다.

function CompareDate(tform){
     var startDate = new Date(document.getElementById("START_DATE").value.substring(0,10));
     var endDate = new Date(document.getElementById("END_DATE").value.substring(0,10));

     if(tform.START_DATE.value!=""){
         var estStartDate = tform.START_DATE.value;
         //format for Oracle
         tform.START_DATE.value = estStartDate + " 00:00:00";
     }

     if(tform.END_DATE.value!=""){
         var estEndDate = tform.END_DATE.value;
         //format for Oracle
         tform.END_DATE.value = estEndDate + " 00:00:00";
     }

     if(endDate <= startDate){
         alert("End date cannot be smaller than or equal to Start date, please review you selection.");
         tform.START_DATE.value = document.getElementById("START_DATE").value.substring(0,10);
         tform.END_DATE.value = document.getElementById("END_DATE").value.substring(0,10);
         return false;
     }
}

onsubmit 양식에서 이것을 호출합니다. 도움이 되었기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.