순간 js 날짜 시간 비교


384

날짜 시간 형식을 지정하기 위해 moment.js를 사용하고 있습니다. 여기에는 두 개의 날짜 값이 있으며 한 날짜가 다른 날짜보다 클 때 특정 기능을 달성하려고합니다. 나는 대부분의 문서를 읽었지만 이것을 달성하는 기능을 찾지 못했습니다. 나는 그것이있을 것이라는 것을 안다.

이것은 내 코드입니다.

var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'
var d = moment(date_time).tz('UTC'); // first date 

var now = new Date(),
    dnow = moment(now).tz('UTC'),
    snow = dnow.minute() % 15,
    diffnow = 15 - snow,
    tonow = moment(dnow).add('minute', diffnow),
    ahead30now = moment(tonow).add('minute', 30);

if (d > ahead30now) {
    // allow input time
    console.log('UTC TIME DB', d.format());
} else {

}

편집하다

var date_time = req.body.date + 'T' + req.body.time + req.body.timezone; // 2014-03-24T01:15:000
var utc_input_time = moment(date_time).utc(); // 2014-03-24T01:15:000
console.log('utc converted date_time', moment(date_time).utc().format("YYYY-MM-DDTHH:mm:SSS"));
var isafter = moment(utc_input_time).isAfter(moment('2014-03-24T01:14:000')); // true
if(isafter === true){
    console.log('is after true');
} else {
    console.log('is after is false');
}

여기서 두 날짜를 비교 2014-03-24T01:15:000 > 2014-03-24T01:14:000하고 있습니다. 즉 , 첫 번째 날짜가 두 번째 날짜 보다 클 것으로 예상하지만 항상 else 조건으로 이동합니다. 왜 그런지 모르겠어요?

답변:


540

난 당신이 찾고있는 생각 조회 기능을 , isBefore, isSame,와 isAfter.

그러나 당신이 무엇을 시도하고 있는지 정확하게 말하기는 약간 어렵습니다. 아마도 입력 시간과 현재 시간의 차이를 얻고 싶습니까? 그렇다면, 고려 차이 기능을 , diff. 예를 들면 다음과 같습니다.

moment().diff(date_time, 'minutes')

몇 가지 다른 것들 :

  • 첫 번째 줄에 오류가 있습니다.

    var date_time = 2013-03-24 + 'T' + 10:15:20:12 + 'Z'

    작동하지 않습니다. 나는 당신이 의미한다고 생각합니다 :

    var date_time = '2013-03-24' + 'T' + '10:15:20:12' + 'Z';

    물론 다음과 같이 할 수도 있습니다.

    var date_time = '2013-03-24T10:15:20:12Z';
  • 사용중인 : .tz('UTC')잘못되었습니다. moment-timezone에.tz 속합니다 . 와 같은 다른 시간대로 작업하지 않는 한이를 사용할 필요가 없습니다 .America/Los_Angeles

    값을 UTC로 구문 분석하려면 다음을 사용하십시오.

    moment.utc(theStringToParse)

    또는 로컬 값을 구문 분석 하여 UTC 로 변환하려면 다음을 사용하십시오.

    moment(theStringToParse).utc()

    아니면 전혀 필요하지 않을 수도 있습니다. 입력 값이 UTC로되어 있다고해서 함수 전체에서 UTC로 작업해야한다는 의미는 아닙니다.

  • 에 의해 "지금"인스턴스를 얻는 것 같습니다 moment(new Date()). 대신을 사용할 수 있습니다 moment().

업데이트

편집 내용에 따라 다음과 같이하면됩니다.

var date_time = req.body.date + 'T' + req.body.time + 'Z';
var isafter = moment(date_time).isAfter('2014-03-24T01:14:00Z');

또는 필드의 형식이 올바른지 확인하려면 다음을 수행하십시오.

var m = moment.utc(req.body.date + ' ' + req.body.time, "YYYY-MM-DD  HH:mm:ss");
var isvalid = m.isValid();
var isafter = m.isAfter('2014-03-24T01:14:00Z');

1
소중한 의견 감사합니다. 귀하의 의견을 포함하도록 코드를 편집했지만 차이점을 올바르게 얻지 못했습니다. 편집 한 코드를 확인할 수 있습니까
Dibish

3
업데이트 된 답변을 참조하십시오. 초 필드의 자릿수도보십시오. 그리고 req.body.timezone이외의 다른 것이 Z있습니까? 그렇다면 무엇입니까?
Matt Johnson-Pint

편집 된 코드에 대해 대단히 감사합니다. 거의 거기에 도달했습니다. 내 경우에는 사용자 측의 시간대 번호가 있습니다. .utc () 얼마 전에 유효하지 않은 날짜
Dibish

1
+05 : 30을 넣으면 훌륭하게 작동합니다. 다시 한번 당신의 친절에 감사드립니다
Dibish

.isSame ()은 내가 찾던 것입니다. 어떻게 든 전에 문서에서 그것을 놓쳤습니다.
Will Strohl

231

직접 비교할 수 있어야합니다.

var date = moment("2013-03-24")
var now = moment();

if (now > date) {
   // date is past
} else {
   // date is future
}


87
자바 스크립트가 객체를 프리미티브로 강제 변환 Object.prototype.valueOf하여 획기적인 타임 스탬프를 숫자로 반환하는 순간 프로토 타입에서 재정의 되기 때문에 이것이 효과가 있다고 설명 하는 것이 좋습니다. 따라서 이것은와 비슷합니다 now.format('x') > date.format('x').
tandrewnichols

그것의 작동하지 않습니다 ... 여기 내가 시도한 것입니다. // newDate가 현재 날짜보다 높으며 현재보다 더 높거나 적은 조건에서 인쇄가 실패 함 const resDate = res.url.expiryDate; const newDate = 순간 (resDate); var now = moment (). format ( "DD / MM / YYYY"); if (now <newDate) {console.log ( "성공"); } else {console.log ( "fail")}
steve

3
@steve moment().format("DD/MM/YYYY")는 문자열을 반환 한 다음 알파벳순으로 비교 한 다음 12 월 1 일이 1 월 2 일 전에 올 것입니다. format()모멘트 objct를 직접 비교하려면 사용하지 마십시오 .
ryanwinchester

28

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가 dateTimeB보다 큰 경우이 메소드는 1을 리턴합니다.

dateTimeA가 dateTimeB와 같은 경우이 메소드는 0을 리턴합니다.

dateTimeA가 dateTimeB보다 작은 경우이 메소드는 -1을 리턴합니다.


1
function compare1 (dateTimeA, dateTimeB) {return moment (dateTimeA, 'MM / DD / YYYY'). diff (dateTimeB, 'MM / DD / YYYY'); }
Shamseer

23

당신의 날짜가 올바른에 있다는 것이 중요하다 ISO 형식 의 임의 사용하는 경우 momentjs 쿼리를 : isBefore, isAfter, isSameOrBefore, isSameOrAfter,isBetween

따라서 2014-03-24T01 : 14 : 000 대신 날짜 시간은 다음 중 하나 여야합니다.

2014-03-24T01 : 14 : 00 또는 2014-03-24T01 : 14 : 00.000Z

그렇지 않으면 다음과 같은 지원 중단 경고가 표시 될 수 있으며 조건은 false로 평가됩니다.

지원 중단 경고 : 제공된 값이 인식 된 RFC2822 또는 ISO 형식이 아닙니다. 모멘트 구성은 js Date ()로 돌아가며 모든 브라우저와 버전에서 신뢰할 수있는 것은 아닙니다. 비 RFC2822 / ISO 날짜 형식은 권장되지 않으며 향후 주요 릴리스에서 제거 될 예정입니다. 자세한 내용은 http://momentjs.com/guides/#/warnings/js-date/ 를 참조하십시오 .

// https://momentjs.com/docs/#/query/

const dateIsAfter = moment('2014-03-24T01:15:00.000Z').isAfter(moment('2014-03-24T01:14:00.000Z'));

const dateIsSame = moment('2014-03-24T01:15:00.000Z').isSame(moment('2014-03-24T01:14:00.000Z'));

const dateIsBefore = moment('2014-03-24T01:15:00.000Z').isBefore(moment('2014-03-24T01:14:00.000Z'));

console.log(`Date is After: ${dateIsAfter}`);
console.log(`Date is Same: ${dateIsSame}`);
console.log(`Date is Before: ${dateIsBefore}`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.0/moment.min.js"
></script>


10

이와 같이 날짜를 순간으로 전달하면 결과가 비교됩니다. 포맷을 원하지 않으면 제거하십시오.

moment(Date1).format("YYYY-MM-DD") > moment(Date2).format("YYYY-MM-DD")

6
Be careful이것은 단지 두 문자열을 비교하는 것입니다
Pranoy Sarkar

@PranoySarkar 왜 우리가 더 조심해야하는지 말해 주시겠습니까?
DEEPESH KUMAR R


2

날짜-시간 비교 valueOf의 경우 날짜-시간의 밀리 초를 제공하는 순간의 기능을 사용할 수 있습니다 .

let date1 = moment('01-02-2020','DD-MM-YYYY').valueOf()
let date2 = moment('11-11-2012','DD-MM-YYYY').valueOf()

//     alert((date1 > date2 ? 'date1' : 'date2') + " is greater..."  )

if (date1 > date2) {
   alert("date1 is greater..." )
} else {
   alert("date2 is greater..." )
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>


1
        var startDate = moment(startDateVal, "DD.MM.YYYY");//Date format
        var endDate = moment(endDateVal, "DD.MM.YYYY");

        var isAfter = moment(startDate).isAfter(endDate);

        if (isAfter) {
            window.showErrorMessage("Error Message");
            $(elements.endDate).focus();
            return false;
        }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.