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


403

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>

5
사용자가 "두 날짜 사이의 일 수"를 요구하는 경우의 99 %는 그녀가 사과와 배를 비교하려고한다는 것입니다. "날짜 범위에 몇 개의 날짜가 있습니까?"또는 달력에서 몇 개의 사각형을 건너야하는지 문제가 발생하면 문제가 매우 간단 해집니다. 이것은 시간 및 일광 절약 문제 등을 제거합니다. 순수한 넌센스 날짜 시간 데이터 구조로 인해 혼란이 발생합니다. 날짜 시간과 날짜, 시간과 같은 것은 없습니다. 자연과 행동 모두에서 매우 뚜렷한 두 가지 대상
Mihail Shishkov

차이를 (전체) 시간 단위로 나누는 함수의 경우 stackoverflow.com/a/53092438/3787376 의 답변을 사용하십시오 .
Edward

대부분의 답변이 부정확하거나 다양한 라이브러리에 의존하기 때문에이 질문을 삭제하거나 최소한 "피할 것"으로 표시해야한다고 생각합니다.
RobG

답변:


409

다음은 질문에 제시된대로 문제를 해결하기위한 개념 증명으로 빠르고 더러운 구현입니다 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 프레임 워크 를 사용해야합니다 .


2
Math.trunc ()가 더 적합하다고 생각합니다. 누군가가보다 정확한 Date 객체를 사용하는 경우 (예 : 시간, 분, 초 포함)
Jin Wang

21
정답과 가장 높은 투표로 표시된 답변 (현재)은이 답변이 일광 절약 시간제를 올바르게 처리하지 못한다고 언급하는 것이 좋습니다. 대신 Michael Liu의 답변을 참조하십시오.
osullic

parseDate는 정확히 무엇을합니까?
모하마드 케르 마니

2
@ osullic—이 답변은 Math.round를 사용 하여 일광 절약 시간제를 처리 하지만 날짜와 시간이 아닌 문자열 만 처리 할 것으로 예상됩니다.
RobG

2
이 예에서 날짜는 미국 형식입니다 (예 : MM / DD / YYYY). 영국 버전이 필요한 경우 parseDate방법을 다음과 같이 변경해야 합니다.return new Date(mdy[2], mdy[1], mdy[0]-1);
Viqas

207

이 글을 쓰는 시점에서 다른 답변 중 하나만 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는 윤초를 무시합니다.


2
UTC를 사용할 필요가 없습니다. 현지 시간을 자정 (또는 두 날짜에 대해 동일한 값)으로 설정하는 것이 좋습니다. 일광 절약 시간제에 의해 도입 된 소수의 날은 최대 ± 0.04 (일부 지역에서는 적음)이므로 Math.round로 반올림됩니다 . ;-) 문자열을 구문 분석하기 위해 Date 생성자에 의존하는 것은 좋지 않습니다. UTC 값을 실제로 사용 Date.UTC(...)하려면 먼저 문자열을 구문 분석하십시오 .
RobG

2
@RobG : 내가 대답 한대로 말했듯이 : "Math.round가 정확한 결과를 반환하지만 다소 어색하다고 생각합니다. 대신 DST가 시작되거나 종료 될 때 UTC 오프셋의 변경 사항을 명시 적으로 설명함으로써 정확한 산술을 사용할 수 있습니다."
Michael Liu

실제로 "잘못된"것으로 표시된 시간은 기술적으로 정확합니다. DateTimes를 UTC로 변경하지 않고 ... 인공 정수를 얻기 위해 각 DateTime의 시간을 변경하기 만합니다. 반올림은 "바삭 바삭"하지 않습니다. 어쨌든 머리에서하고있는 일이기 때문에 정확하게 올바른 접근 방식입니다. 시간 부분 (시간, 분, 초)을 반올림하고 전체를 얻으려고합니다. 일수.
JDB는 여전히 Monica

116

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

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;
    }
}

2
나쁜 대답입니다. Math.floor ()는 일광 절약 시간 제로 시계가 앞으로 나아갈 때 하루를 잃게됩니다. Math.round ()는 대부분의 상황에서 정답을 제공하지만 다른 답변에도 더 나은 옵션이 있습니다.
Phil B

101

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

10
momentjs가 훌륭 할 때 경고하는 것처럼, 그것은 매우 큰 의존성입니다
Jason Axelson

end.diff(start,"days")시작 날짜가 종료 날짜 이후이므로 실제로 작성된 코드가 작동하지만 실제로 있어야 합니다!
gordon613

40

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

        <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>

28
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 와 같은 라이브러리를 사용하는 것이 좋습니다 .


5
다음과 같은 답변을 주셔서 감사합니다. 짧고 간단하며 임의의 종속성이 필요하지 않습니다! 건배.
daCoda

2
그것은 한 나 바로가 timeDiff부정적으로 반환은? 안 timeDiff(new Date(endDate)) - (new Date(startDate));?
Feyisayo Sonubi 1

@ feyisayo-sonubi는 시작일과 종료일이 어느 순서로 전달되는지에 따라 다릅니다. 이 예에서(new Date('2017-11-08')) - (new Date('2017-10-01')) // 3283200000
marcobiedermann

const timeDiff = +(new Date(start)) - +(new Date(end));
벤 라치 콧

큰. 내가 선호하지만return (Date.UTC(yr2, mo2-1, dy2) - Date.UTC(yr1, mo1-1, dy1)) / 86400000;
dcromley

13

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>


moment.js는 YTD diff와 같은 것들에 정말 유용합니다 var now = moment(), yearStart = moment().startOf('year'); var ytdDays = now.diff(yearStart, 'days'); // this can be years, months, weeks, days, hours, minutes, and seconds console.log(ytdDays); : momentjs.com
Sharif

10

JS의 날짜 값은 날짜 시간 값입니다.

따라서 직접 날짜 계산이 일치하지 않습니다.

(2013-11-05 00:00:00) - (2013-11-04 10:10:10) < 1 day

예를 들어 두 번째 날짜를 변환해야합니다.

(2013-11-05 00:00:00) - (2013-11-04 00:00:00) = 1 day

이 방법은 두 날짜 모두에서 밀을자를 수 있습니다.

var date1 = new Date('2013/11/04 00:00:00');
var date2 = new Date('2013/11/04 10:10:10'); //less than 1
var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);

date2 = new Date('2013/11/05 00:00:00'); //1

var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);


9

UTC 시간을 사용하여 DST, Math.ceil, Math.floor 등을 제거하는 것이 좋습니다.

var firstDate = Date.UTC(2015,01,2);
var secondDate = Date.UTC(2015,04,22);
var diff = Math.abs((firstDate.valueOf() 
    - secondDate.valueOf())/(24*60*60*1000));

이 예는 차이가 109 일입니다. 24*60*60*1000밀리 초 단위의 하루입니다.


9

주어진 두 날짜 사이의 날짜를 계산하려면 다음 코드를 사용할 수 있습니다. 여기에서 사용하는 날짜는 2016 년 1 월 1 일과 2016 년 12 월 31 일입니다.

var day_start = new Date("Jan 01 2016");
var day_end = new Date("Dec 31 2016");
var total_days = (day_end - day_start) / (1000 * 60 * 60 * 24);
document.getElementById("demo").innerHTML = Math.round(total_days);
<h3>DAYS BETWEEN GIVEN DATES</h3>
<p id="demo"></p>


9

다음 공식을 사용하여 다른 TZ에서 휴식하는 두 날짜 사이의 완전한 증거 일 차이를 계산할 수 있습니다.

var start = new Date('10/3/2015');
var end = new Date('11/2/2015');
var days = (end - start) / 1000 / 60 / 60 / 24;
console.log(days);
// actually its 30 ; but due to daylight savings will show 31.0xxx
// which you need to offset as below
days = days - (end.getTimezoneOffset() - start.getTimezoneOffset()) / (60 * 24);
console.log(days);


이것이 가장 정답입니다. DST를 고려해야합니다! 감사합니다
Gisway

6

두 날짜에 계산을 원할 때이 질문을 찾았지만 날짜에는 시간과 분 값이 있으며 요구 사항에 맞게 @ michael-liu의 답변을 수정했으며 테스트를 통과했습니다.

DIFF 일 2012-12-31 23:002013-01-01 01:001 (2시간) DIFF 일 같아야 2012-12-31 01:00하고 2013-01-01 23:001 (46시간)를 같아야

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

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

6
var start= $("#firstDate").datepicker("getDate");
var end= $("#SecondDate").datepicker("getDate");
var days = (end- start) / (1000 * 60 * 60 * 24);
 alert(Math.round(days));

jsfiddle 예제 :)


6

나는 솔루션은 내가 사용하는 것이 100 % 정확하지 생각 CEIL 대신 바닥 , 라운드 의지 작업을하지만 올바른 작동하지 않습니다.

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

4
요일은 24 시간 이상, 분은 60 초 이상이 될 수 있습니다. 이 경우 Math.ceil ()을 사용하면 초과 계산됩니다.
리치 도허티

5

DatePicker 위젯에서 formatDate 를 사용하는 것은 어떻습니까? 이를 사용하여 날짜를 타임 스탬프 형식 (01/01/1970 이후 밀리 초)으로 변환 한 다음 간단한 빼기를 수행 할 수 있습니다.


5

function timeDifference(date1, date2) {
  var oneDay = 24 * 60 * 60; // hours*minutes*seconds
  var oneHour = 60 * 60; // minutes*seconds
  var oneMinute = 60; // 60 seconds
  var firstDate = date1.getTime(); // convert to milliseconds
  var secondDate = date2.getTime(); // convert to milliseconds
  var seconds = Math.round(Math.abs(firstDate - secondDate) / 1000); //calculate the diffrence in seconds
  // the difference object
  var difference = {
    "days": 0,
    "hours": 0,
    "minutes": 0,
    "seconds": 0,
  }
  //calculate all the days and substract it from the total
  while (seconds >= oneDay) {
    difference.days++;
    seconds -= oneDay;
  }
  //calculate all the remaining hours then substract it from the total
  while (seconds >= oneHour) {
    difference.hours++;
    seconds -= oneHour;
  }
  //calculate all the remaining minutes then substract it from the total 
  while (seconds >= oneMinute) {
    difference.minutes++;
    seconds -= oneMinute;
  }
  //the remaining seconds :
  difference.seconds = seconds;
  //return the difference object
  return difference;
}
console.log(timeDifference(new Date(2017,0,1,0,0,0),new Date()));


1
답변에 더 많은 컨텍스트를 추가하도록 요청하십시오. 코드 전용 답변은 이해하기 어렵습니다. 게시물에 더 많은 정보를 추가 할 수있는 경우 asker 및 향후 독자 모두에게 도움이됩니다.
RBT

나는 편집하고 싶었지만 편집을 제출할 수있는 오류가 발생했습니다 :(.
Noreddine Belhadj Cheikh

2
@ N.Belhadj 모든 while 루프를 간단한 div 및 mod (%) 연산으로 대체 할 수 있습니다.
Mihail Shishkov

4

이것은 가장 우아한 해결책은 아니지만 비교적 간단한 코드로 질문에 대답하는 것 같습니다. 다음과 같은 것을 사용할 수 없습니다 :

function dayDiff(startdate, enddate) {
  var dayCount = 0;

  while(enddate >= startdate) {
    dayCount++;
    startdate.setDate(startdate.getDate() + 1);
  }

return dayCount; 
}

이것은 날짜 객체를 매개 변수로 전달한다고 가정합니다.


4

유닉스 타임 스탬프가 두 개인 경우이 기능을 사용할 수 있습니다 (명확성을 위해 조금 더 자세하게 표시).

// Calculate number of days between two unix timestamps
// ------------------------------------------------------------
var daysBetween = function(timeStampA, timeStampB) {
    var oneDay = 24 * 60 * 60 * 1000; // hours * minutes * seconds * milliseconds
    var firstDate = new Date(timeStampA * 1000);
    var secondDate = new Date(timeStampB * 1000);
    var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    return diffDays;
};

예:

daysBetween(1096580303, 1308713220); // 2455

4

밀리 초를 사용할 때주의하십시오 .

date.getTime는 () (밀리 초)을 반환하고 일을 밀리 초 단위로 수학 연산은 포함 할 필요

  • 일광 절약 시간제 (DST)
  • 두 날짜가 같은 시간인지 확인 (시간, 분, 초, 밀리 초)
  • diff가 필요한 일의 행동을 확인하십시오 : 2016 년 9 월 19 일-2016 년 9 월 29 일 = 1 일 또는 2 일 차이?

위의 의견의 예는 지금까지 https://stackoverflow.com/a/11252167/2091095 에서 찾은 최고의 솔루션 입니다. 그러나 모든 요일을 계산하려면 결과에 +1 을 사용하십시오 .

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;
}

var diff = daysBetween($('#first').val(), $('#second').val()) + 1;

4

Date.prototype.days = function(to) {
  return Math.abs(Math.floor(to.getTime() / (3600 * 24 * 1000)) - Math.floor(this.getTime() / (3600 * 24 * 1000)))
}


console.log(new Date('2014/05/20').days(new Date('2014/05/23'))); // 3 days

console.log(new Date('2014/05/23').days(new Date('2014/05/20'))); // 3 days


3

Angular에서도 같은 문제가있었습니다. 다른 사람이 첫 번째 날짜를 덮어 쓰므로 사본을 작성합니다. 두 날짜 모두 시간이 00:00:00이어야합니다 (분명히)

 /*
* Deze functie gebruiken we om het aantal dagen te bereken van een booking.
* */
$scope.berekenDagen = function ()
{
    $scope.booking.aantalDagen=0;

    /*De loper is gelijk aan de startdag van je reservatie.
     * De copy is nodig anders overschijft angular de booking.van.
     * */
    var loper = angular.copy($scope.booking.van);

    /*Zolang de reservatie beschikbaar is, doorloop de weekdagen van je start tot einddatum.*/
    while (loper < $scope.booking.tot) {
        /*Tel een dag op bij je loper.*/
        loper.setDate(loper.getDate() + 1);
        $scope.booking.aantalDagen++;
    }

    /*Start datum telt natuurlijk ook mee*/
    $scope.booking.aantalDagen++;
    $scope.infomsg +=" aantal dagen: "+$scope.booking.aantalDagen;
};

3

아래 코드를 사용하여 뉴스 게시물의 게시 날짜 기능을 실험했습니다. 게시 날짜와 현재 날짜를 기준으로 분, 시간 또는 일 또는 연도를 계산합니다.

var startDate= new Date("Mon Jan 01 2007 11:00:00");
var endDate  =new Date("Tue Jan 02 2007 12:50:00");
var timeStart = startDate.getTime();
var timeEnd = endDate.getTime();
var yearStart = startDate.getFullYear();
var yearEnd   = endDate.getFullYear();
if(yearStart == yearEnd)
 {
  var hourDiff = timeEnd - timeStart; 
  var secDiff = hourDiff / 1000;
  var minDiff = hourDiff / 60 / 1000; 
  var hDiff = hourDiff / 3600 / 1000; 
  var myObj = {};
  myObj.hours = Math.floor(hDiff);
  myObj.minutes = minDiff  
  if(myObj.hours >= 24)
   {
    console.log(Math.floor(myObj.hours/24) + "day(s) ago")
   } 
 else if(myObj.hours>0)
  {
   console.log(myObj.hours +"hour(s) ago")
  }
 else
  {
   console.log(Math.abs(myObj.minutes) +"minute(s) ago")
  }
}
else
{
var yearDiff = yearEnd - yearStart;
console.log( yearDiff +" year(s) ago");
}

코드를 설명해 주시면 문제를 해결했습니다. 코드 붙여 넣기는 나쁜 답변으로 간주됩니다.
Marco Scabbiolo

2
이 코드는 질문에 대답 할 수 있지만 문제를 해결하는 방법 및 / 또는 이유 에 대한 추가 컨텍스트를 제공 하면 답변의 장기적인 가치가 향상됩니다.
마이클 파커

의견에 대해 @ MarcoScabbiolo, @ Michael Parker에게 감사드립니다. 답변 측면에서 Stackoverflow를 처음 사용하기 때문에 솔루션을 어떻게 제공해야하는지 몰랐습니다.
Ramees Rahath

3

날짜가있는 DateArray를 원하면 다음을 시도하십시오.

<script>
        function getDates(startDate, stopDate) {
        var dateArray = new Array();
        var currentDate = moment(startDate);
        dateArray.push( moment(currentDate).format('L'));

        var stopDate = moment(stopDate);
        while (dateArray[dateArray.length -1] != stopDate._i) {
            dateArray.push( moment(currentDate).format('L'));
            currentDate = moment(currentDate).add(1, 'days');
        }
        return dateArray;
      }
</script>

DebugSnippet


3

두 날짜 사이의 날짜를 계산하는 간단한 방법은 시간 구성 요소, 즉시, 분, 초 및 밀리 초를 0으로 설정 한 다음 시간을 빼고 하루의 밀리 초로 다이빙하는 것입니다.

var firstDate= new Date(firstDate.setHours(0,0,0,0));
var secondDate= new Date(secondDate.setHours(0,0,0,0));
var timeDiff = firstDate.getTime() - secondDate.getTime();
var diffDays =timeDiff / (1000 * 3600 * 24);

솔루션의 문제는 firstDate와 secondDate를 날짜로 가정하고 다시 날짜로 변경할 필요가 없으며 날짜가 아닌 날짜가 아닌 경우 setHours에 오류가 발생한다는 것입니다. 이 문제를 해결하려면 setHours를new Date
AaA

2
function formatDate(seconds, dictionary) {
    var foo = new Date;
    var unixtime_ms = foo.getTime();
    var unixtime = parseInt(unixtime_ms / 1000);
    var diff = unixtime - seconds;
    var display_date;
    if (diff <= 0) {
        display_date = dictionary.now;
    } else if (diff < 60) {
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.second;
        } else {
            display_date = diff + ' ' + dictionary.seconds;
        }
    } else if (diff < 3540) {
        diff = Math.round(diff / 60);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.minute;
        } else {
            display_date = diff + ' ' + dictionary.minutes;
        }
    } else if (diff < 82800) {
        diff = Math.round(diff / 3600);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.hour;
        } else {
            display_date = diff + ' ' + dictionary.hours;
        }
    } else {
        diff = Math.round(diff / 86400);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.day;
        } else {
            display_date = diff + ' ' + dictionary.days;
        }
    }
    return display_date;
}

2

간단하고 정교합니다. 이 기능은 업데이트 시간을 위해 1 초마다 호출됩니다.

const year = (new Date().getFullYear());
const bdayDate = new Date("04,11,2019").getTime();  //mmddyyyy

// countdown
let timer = setInterval(function() {

// get today's date
const today = new Date().getTime();

// get the difference
const diff = bdayDate - today;

// math
let days = Math.floor(diff / (1000 * 60 * 60 * 24));
let hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
let minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
let seconds = Math.floor((diff % (1000 * 60)) / 1000);

}, 1000);

1

더 나은 솔루션

시간 부분 무시

두 날짜가 모두 같은 경우 0을 반환합니다.

function dayDiff(firstDate, secondDate) {
  firstDate = new Date(firstDate);
  secondDate = new Date(secondDate);
  if (!isNaN(firstDate) && !isNaN(secondDate)) {
    firstDate.setHours(0, 0, 0, 0); //ignore time part
    secondDate.setHours(0, 0, 0, 0); //ignore time part
    var dayDiff = secondDate - firstDate;
    dayDiff = dayDiff / 86400000; // divide by milisec in one day
    console.log(dayDiff);
  } else {
    console.log("Enter valid date.");
  }
}

$(document).ready(function() {
  $('input[type=datetime]').datepicker({
    dateFormat: "mm/dd/yy",
    changeMonth: true,
    changeYear: true
  });
  $("#button").click(function() {
    dayDiff($('#first').val(), $('#second').val());
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<input type="datetime" id="first" value="12/28/2016" />
<input type="datetime" id="second" value="12/28/2017" />
<input type="button" id="button" value="Calculate">


1

1970-01-01 이전 및 2038-01-19 이후 날짜의 기여

function DateDiff(aDate1, aDate2) {
  let dDay = 0;
  this.isBissexto = (aYear) => {
    return (aYear % 4 == 0 && aYear % 100 != 0) || (aYear % 400 == 0);
  };
  this.getDayOfYear = (aDate) => {
    let count = 0;
    for (let m = 0; m < aDate.getUTCMonth(); m++) {
      count += m == 1 ? this.isBissexto(aDate.getUTCFullYear()) ? 29 : 28 : /(3|5|8|10)/.test(m) ? 30 : 31;
    }
    count += aDate.getUTCDate();
    return count;
  };
  this.toDays = () => {
    return dDay;
  };
  (() => {
    let startDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate1.toISOString()) : new Date(aDate2.toISOString());
    let endDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate2.toISOString()) : new Date(aDate1.toISOString());
    while (startDate.getUTCFullYear() != endDate.getUTCFullYear()) {
      dDay += (this.isBissexto(startDate.getFullYear())? 366 : 365) - this.getDayOfYear(startDate) + 1;
      startDate = new Date(startDate.getUTCFullYear()+1, 0, 1);
    }
    dDay += this.getDayOfYear(endDate) - this.getDayOfYear(startDate);
  })();
}

0
   function validateDate() {
        // get dates from input fields
        var startDate = $("#startDate").val();
        var endDate = $("#endDate").val();
        var sdate = startDate.split("-");
        var edate = endDate.split("-");
        var diffd = (edate[2] - sdate[2]) + 1;
        var leap = [ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        var nonleap = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        if (sdate[0] > edate[0]) {
            alert("Please enter End Date Year greater than Start Date Year");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[1] > edate[1]) {
            alert("Please enter End Date month greater than Start Date month");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[2] > edate[2]) {
            alert("Please enter End Date greater than Start Date");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else {
            if (sdate[0] / 4 == 0) {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + leap[sdate[1]++];
                }
            } else {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + nonleap[sdate[1]++];
                }
            }
            document.getElementById("numberOfDays").value = diffd;
        }
    }

0

UnderscoreJS를 사용하여 차이를 형식화하고 계산할 수 있습니다.

데모 https://jsfiddle.net/sumitridhal/8sv94msp/

 var startDate = moment("2016-08-29T23:35:01");
var endDate = moment("2016-08-30T23:35:01");  
  

console.log(startDate);
console.log(endDate);

var resultHours = endDate.diff(startDate, 'hours', true);

document.body.innerHTML = "";
document.body.appendChild(document.createTextNode(resultHours));
body { white-space: pre; font-family: monospace; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>

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