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

JavaScript에서 두 날짜 사이의 일수는 어떻게 알 수 있습니까? 예를 들어, 입력 상자에 두 개의 날짜가 주어지면 :

<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

<script>
  alert(datediff("day", first, second)); // what goes here?
</script>



답변

다음은 질문에 제시된대로 문제를 해결하기위한 개념 증명으로 빠르고 더러운 구현입니다 datediff. 그것은 두 날짜 사이의 경과 된 밀리 초를 빼서 얻을 수 있다는 사실에 의존합니다.이 숫자는 기본 숫자 값 (1970 년 시작 이후 밀리 초)으로 강제 변환됩니다.

// new Date("dateString") is browser-dependent and discouraged, so we'll write
// a simple parse function for U.S. date format (which does no error checking)
function parseDate(str) {
    var mdy = str.split('/');
    return new Date(mdy[2], mdy[0]-1, mdy[1]);
}

function datediff(first, second) {
    // Take the difference between the dates and divide by milliseconds per day.
    // Round to nearest whole number to deal with DST.
    return Math.round((second-first)/(1000*60*60*24));
}

alert(datediff(parseDate(first.value), parseDate(second.value)));
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

이름에 “UTC”가없는 “일반”날짜 API는 사용자 브라우저의 현지 시간대에서 작동하므로 일반적으로 사용자가 아닌 시간대에 있으면 문제가 발생할 수 있습니다. 코드가 일광 절약 시간 전환을 처리해야합니다. Date 객체 및 해당 메서드에 대한 설명서를주의 깊게 읽어야하며,보다 복잡한 작업에 대해서는 날짜 조작에보다 안전하고 강력한 API를 제공하는 라이브러리를 사용하는 것이 좋습니다.

또한, 설명을 위해 스 니펫은 간결성 을 위해 window오브젝트 에서 이름 지정된 액세스를 사용 하지만 프로덕션에서는 getElementById 와 같은 표준화 된 API 또는 일부 UI 프레임 워크 를 사용해야합니다 .


답변

이 글을 쓰는 시점에서 다른 답변 중 하나만 DST (일광 절약 시간) 전환을 올바르게 처리합니다. 캘리포니아에 위치한 시스템의 결과는 다음과 같습니다.

                                        1/1/2013- 3/10/2013- 11/3/2013-
User       Formula                      2/1/2013  3/11/2013  11/4/2013  Result
---------  ---------------------------  --------  ---------  ---------  ---------
Miles                   (d2 - d1) / N   31        0.9583333  1.0416666  Incorrect
some         Math.floor((d2 - d1) / N)  31        0          1          Incorrect
fuentesjr    Math.round((d2 - d1) / N)  31        1          1          Correct
toloco     Math.ceiling((d2 - d1) / N)  31        1          2          Incorrect

N = 86400000

Math.round올바른 결과를 반환 하지만 다소 복잡하다고 생각합니다. 대신 DST가 시작되거나 종료 될 때 UTC 오프셋에 대한 변경 사항을 명시 적으로 설명함으로써 정확한 산술을 사용할 수 있습니다.

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

alert(daysBetween($('#first').val(), $('#second').val()));

설명

Date객체가 현지 시간이 아닌 UTC로 내부적으로 시간을 저장 하기 때문에 JavaScript 날짜 계산이 까다 롭습니다 . 예를 들어, 2013 년 3 월 10 일 12:00 AM 태평양 표준시 (UTC-08 : 00)는 2013 년 3 월 10 일 오전 8시 (UTC) 오전 3/11/2013 12:00 오전 태평양 표준시 일광 절약 시간 ( UTC-07 : 00)은 2013 년 3 월 11 일 7:00 AM UTC로 저장됩니다. 이 날 자정부터 자정까지의 현지 시간은 UTC로 23 시간입니다.

현지 시간으로 하루를 24 시간 이상 가질 수 있지만 UTC로 하루는 항상 정확히 24 시간입니다. 1daysBetween 위 의 방법은 treatAsUTC빼고 나누기 전에 먼저 현지 시간을 UTC 자정으로 조정하도록 호출하여이 사실 을 이용합니다.

1. JavaScript는 윤초를 무시합니다.


답변

두 날짜의 차이를 얻는 가장 쉬운 방법은 다음과 같습니다.

var diff =  Math.floor(( Date.parse(str2) - Date.parse(str1) ) / 86400000); 

차이 일을 얻습니다 (또는 하나 또는 둘 다 구문 분석 할 수없는 경우 NaN). 구문 분석 날짜는 밀리 초 단위로 결과를 제공했으며 하루 단위로 결과를 24 * 60 * 60 * 1000으로 나누어야합니다.

일, 시간, 분, 초 및 밀리 초로 나누려면 다음을 수행하십시오.

function dateDiff( str1, str2 ) {
    var diff = Date.parse( str2 ) - Date.parse( str1 );
    return isNaN( diff ) ? NaN : {
        diff : diff,
        ms : Math.floor( diff            % 1000 ),
        s  : Math.floor( diff /     1000 %   60 ),
        m  : Math.floor( diff /    60000 %   60 ),
        h  : Math.floor( diff /  3600000 %   24 ),
        d  : Math.floor( diff / 86400000        )
    };
}

제임스 버전의 리팩토링 된 버전은 다음과 같습니다.

function mydiff(date1,date2,interval) {
    var second=1000, minute=second*60, hour=minute*60, day=hour*24, week=day*7;
    date1 = new Date(date1);
    date2 = new Date(date2);
    var timediff = date2 - date1;
    if (isNaN(timediff)) return NaN;
    switch (interval) {
        case "years": return date2.getFullYear() - date1.getFullYear();
        case "months": return (
            ( date2.getFullYear() * 12 + date2.getMonth() )
            -
            ( date1.getFullYear() * 12 + date1.getMonth() )
        );
        case "weeks"  : return Math.floor(timediff / week);
        case "days"   : return Math.floor(timediff / day);
        case "hours"  : return Math.floor(timediff / hour);
        case "minutes": return Math.floor(timediff / minute);
        case "seconds": return Math.floor(timediff / second);
        default: return undefined;
    }
}


답변

moment.js 라이브러리 ( http://momentjs.com/docs/#/displaying/difference/ )를 사용하는 것이 좋습니다 . 일광 절약 시간을 정확하게 처리하며 일반적으로 작업하기에 좋습니다.

예:

var start = moment("2013-11-03");
var end = moment("2013-11-04");
end.diff(start, "days")
1


답변

계속해서이 작은 유틸리티 를 가져 오면이 기능을 찾을 수 있습니다. 다음은 간단한 예입니다.

        <script type="text/javascript" src="date.js"></script>
        <script type="text/javascript">
            var minutes = 1000*60;
            var hours = minutes*60;
            var days = hours*24;

            var foo_date1 = getDateFromFormat("02/10/2009", "M/d/y");
            var foo_date2 = getDateFromFormat("02/12/2009", "M/d/y");

            var diff_date = Math.round((foo_date2 - foo_date1)/days);
            alert("Diff date is: " + diff_date );
        </script>


답변

const startDate = '2017-11-08';
const endDate   = '2017-10-01';
const timeDiff  = (new Date(startDate)) - (new Date(endDate));
const days      = timeDiff / (1000 * 60 * 60 * 24)
  1. 시작일 설정
  2. 종료일 설정
  3. 차이 계산
  4. 밀리 초를 일로 변환

업데이트 : 이것이 귀하의 질문의 일부는 아니라는 것을 알고 있지만 일반적으로 바닐라 JavaScript에서 날짜 계산이나 조작을 수행하지 말고 date-fns 또는 moment.js 와 같은 라이브러리를 사용하는 것이 좋습니다 .


답변

Moment.js 사용

var future = moment('05/02/2015');
var start = moment('04/23/2015');
var d = future.diff(start, 'days'); // 9
console.log(d);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>