[javascript] JavaScript에서 두 날짜의 차이를 어떻게 알 수 있습니까?

시간 프레임으로 이벤트를 정의 할 수있는 응용 프로그램을 만들고 있습니다. 사용자가 시작일을 선택하거나 변경할 때 종료일을 자동으로 채우고 싶습니다. 그러나 두 시간의 차이를 얻는 방법과 그 차이를 사용하여 새로운 종료 날짜를 만드는 방법을 알 수 없습니다.



답변

JavaScript에서 날짜는 getTime()메소드 를 호출하여 epoc 이후 밀리 초 수로 변환 하거나 숫자 표현식에서 날짜를 사용하여 .

따라서 차이를 얻으려면 두 날짜를 빼면됩니다.

차이를 기반으로 새 날짜를 만들려면 생성자에 밀리 초 수를 전달하면됩니다.

var oldBegin = ...
var oldEnd = ...
var newBegin = ...

var newEnd = new Date(newBegin + oldEnd - oldBegin);

이것은 작동합니다

편집 : @bdukes가 지적한 버그 수정

수정 :

동작에 대한 설명 oldBegin, oldEnd그리고 newBegin있습니다 Date인스턴스. 연산자를 호출 +하고 -Javascript 자동 캐스팅을 트리거하고 valueOf()해당 개체 의 프로토 타입 메서드를 자동으로 호출 합니다. valueOf()메서드가에 Date대한 호출로 객체 에서 구현되는 경우가 발생합니다 getTime().

그래서 기본적으로: date.getTime() === date.valueOf() === (0 + date) === (+date)


답변

JavaScript는 즉시 날짜 차이를 완벽하게 지원합니다.

var msMinute = 60*1000,
    msDay = 60*60*24*1000,
    a = new Date(2012, 2, 12, 23, 59, 59),
    b = new Date("2013 march 12");


console.log(Math.floor((b - a) / msDay) + ' full days between');
console.log(Math.floor(((b - a) % msDay) / msMinute) + ' full minutes between');

이제 몇 가지 함정이 있습니다. 이 시도:

console.log(a - 10);
console.log(a + 10);

따라서 숫자와 날짜를 추가 할 위험이있는 경우 날짜를 number직접 변환하십시오 .

console.log(a.getTime() - 10);
console.log(a.getTime() + 10);

내 첫 번째 예제는 Date 객체의 힘을 보여 주지만 실제로는 시한 폭탄처럼 보입니다.


답변

JsFiddle 데모보기

    var date1 = new Date();
    var date2 = new Date("2025/07/30 21:59:00");
    //Customise date2 for your required future time

    showDiff();

function showDiff(date1, date2){

    var diff = (date2 - date1)/1000;
    diff = Math.abs(Math.floor(diff));

    var days = Math.floor(diff/(24*60*60));
    var leftSec = diff - days * 24*60*60;

    var hrs = Math.floor(leftSec/(60*60));
    var leftSec = leftSec - hrs * 60*60;

    var min = Math.floor(leftSec/(60));
    var leftSec = leftSec - min * 60;

    document.getElementById("showTime").innerHTML = "You have " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds before death.";

setTimeout(showDiff,1000);
}

HTML 코드 :

<div id="showTime"></div>


답변

당신은 시간 구성 요소에 대해 상관하지 않을 경우 사용할 수 있습니다 .getDate().setDate()단지 날짜 부분을 설정할 수 있습니다.

따라서 종료일을 시작일로부터 2 주 후로 설정하려면 다음과 같이하십시오.

function GetEndDate(startDate)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate()+14);
    return endDate;
}

두 날짜 간의 차이 (일)를 반환하려면 다음과 같이하십시오.

function GetDateDiff(startDate, endDate)
{
    return endDate.getDate() - startDate.getDate();
}

마지막으로 2nd에서 반환 된 값을 매개 변수로 사용할 수 있도록 첫 번째 함수를 수정 해 보겠습니다.

function GetEndDate(startDate, days)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate() + days);
    return endDate;
}


답변

감사합니다 @ Vincent Robert , 실제로는 기본 예제를 사용하여 끝냈습니다 newBegin + oldEnd - oldBegin. 다음은 단순화 된 최종 솔루션입니다.

    // don't update end date if there's already an end date but not an old start date
    if (!oldEnd || oldBegin) {
        var selectedDateSpan = 1800000; // 30 minutes
        if (oldEnd) {
            selectedDateSpan = oldEnd - oldBegin;
        }

       newEnd = new Date(newBegin.getTime() + selectedDateSpan));
    }


답변

필요에 따라이 함수는 2 일 간의 차이를 계산하고 소수점 일수로 결과를 반환합니다.

// This one returns a signed decimal. The sign indicates past or future.

this.getDateDiff = function(date1, date2) {
    return (date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24);
}

// This one always returns a positive decimal. (Suggested by Koen below)

this.getDateDiff = function(date1, date2) {
    return Math.abs((date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24));
}


답변

moment.js를 사용하는 경우 한 줄의 코드로 날짜 차이를 제공하는 더 간단한 솔루션이 있습니다.

moment(endDate).diff(moment(beginDate), 'days');

자세한 내용은 moment.js 페이지 에서 확인할 수 있습니다 .

건배, Miguel