JavaScript에서 날짜 차이를 계산하는 방법은 무엇입니까?


181

일, 시간, 분, 초, 밀리 초, 나노 초의 날짜 차이를 계산하고 싶습니다. 내가 어떻게 해?



1
관련된 두 날짜가 다른 시간대에있는 경우 아래 솔루션이 중단됩니다. 보다 정확한 솔루션에 대한 질문은 stackoverflow.com/questions/3224834/… 를 참조하십시오 .
Shyam Habarakada

답변:


219

두 개의 Date객체 가 있다고 가정하면 밀리 초 단위의 차이를 얻기 위해 빼기 만하면됩니다.

var difference = date2 - date1;

거기에서 간단한 산술을 사용하여 다른 값을 도출 할 수 있습니다.


38
이것이 정답입니다. 예 : 일 수의 차이를 얻으려면 Math.floor((date2 - date1) / (1000*60*60*24))다른 단위의 차이를 위해 분모를 조정하십시오 (기본 값은 ms 단위).
trisweb

33
밀리 초를 년으로 변환하기위한 "간단한"산술은 없습니다. bissextile 연도, 시간대를 알고 있어야하며, 하루에는 23 시간 또는 25 시간이 있습니다. 몇 년은 365,25 일이므로 여기에는 간단한 산술이 없습니다 (아직 정확한 해결책을 찾고 있음).
Alexandre Salomé

6
@Alexandre : 몇 년 동안 질문이 없었습니다. 실제로 연도 차이를 계산하는 것은 쉽지 않습니다. 그러나 날짜가 동일한 시간대 (불합리한 가정은 아님)에 있다고 가정하면 며칠 동안 정확합니다. 내가 아는 한 하루는 24 시간으로 정의되며 일광 절약 시간으로 인한 '변이'는 실제로 시간대의 전환입니다. 이미 시간대를 구분하지 않으면 DST 전환이 '반복'하기 때문에 시차를 알아내는 것이 상처의 세계에 빠지게됩니다. 그러나 한 시간대에 머물면 모두 작동합니다.
icktoofay

12
@ trisweb— 일에 차이를 가져 오는 것만 큼 단순한 것은 의견보다 복잡합니다. 화요일 오후 10 시부 터 수요일 오전 9시 사이에 며칠이 걸립니까? 알고리즘은 0이라고 말합니다. 다른 사람들은 1을 생각할 수 있습니다.
RobG

@RobG 상대 론자들은 1보다 많거나 0보다 작게 생각할 수도 있습니다. 모두 관찰자에 따라 다릅니다.
무고한 방관자

78
var DateDiff = {

    inDays: function(d1, d2) {
        var t2 = d2.getTime();
        var t1 = d1.getTime();

        return parseInt((t2-t1)/(24*3600*1000));
    },

    inWeeks: function(d1, d2) {
        var t2 = d2.getTime();
        var t1 = d1.getTime();

        return parseInt((t2-t1)/(24*3600*1000*7));
    },

    inMonths: function(d1, d2) {
        var d1Y = d1.getFullYear();
        var d2Y = d2.getFullYear();
        var d1M = d1.getMonth();
        var d2M = d2.getMonth();

        return (d2M+12*d2Y)-(d1M+12*d1Y);
    },

    inYears: function(d1, d2) {
        return d2.getFullYear()-d1.getFullYear();
    }
}

var dString = "May, 20, 1984";

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

document.write("<br />Number of <b>days</b> since "+dString+": "+DateDiff.inDays(d1, d2));
document.write("<br />Number of <b>weeks</b> since "+dString+": "+DateDiff.inWeeks(d1, d2));
document.write("<br />Number of <b>months</b> since "+dString+": "+DateDiff.inMonths(d1, d2));
document.write("<br />Number of <b>years</b> since "+dString+": "+DateDiff.inYears(d1, d2));

여기 에서 가져온 코드 샘플 .


단일 카운터로 사용되는 경우 주어진 형식의 날짜 차이 만 반환합니다. 예를 들어 3 개월 4 일 5 시간을 원하는 경우 해당 결과가 생성되지 않습니다. 더 많은 3 개월 96 일 및 많은 시간 라인.
Joris Kroos

30

다른 해결책은 차이점을 새로운 Date 객체로 변환하고 해당 날짜의 연도 (1970 년부터 차이), 월, 일 등을 얻는 것입니다.

var date1 = new Date(2010, 6, 17);
var date2 = new Date(2013, 12, 18);
var diff = new Date(date2.getTime() - date1.getTime());
// diff is: Thu Jul 05 1973 04:00:00 GMT+0300 (EEST)

console.log(diff.getUTCFullYear() - 1970); // Gives difference as year
// 3

console.log(diff.getUTCMonth()); // Gives month count of difference
// 6

console.log(diff.getUTCDate() - 1); // Gives day count of difference
// 4

따라서 차이는 "3 년 6 개월 4 일"과 같습니다. 사람이 읽을 수있는 스타일을 바꾸고 싶다면 도움이 될 수 있습니다.


의미가 아닙니다! 우리는 전체적인 차이를 원합니다! 이 시험에서 며칠의 차이는 481이 아니라 1281입니다.
chaim.dev

3
@ chaim.dev "사람이 읽을 수있는 스타일로 변화를 원한다면 도움이 될 것입니다."
Murat Çorlu

7
이것은 신뢰할 수 없습니다. 다양한 월 길이 또는 윤년 및 기타 이상을 고려하지 않습니다.
Marc Durdin

2
감사합니다 Murat,이 솔루션은 내 문제를 해결했습니다. 내가 정말로 원하는 것은 PHP와 같은 방식으로 작동해야합니다.
Ritesh Patadiya

27

"일의 차이"와 같은 표현은 결코 간단하지 않습니다. 다음 날짜가있는 경우 :

d1: 2011-10-15 23:59:00
d1: 2011-10-16 00:01:00

시간 차이는 2 분이며 "일의 차이"는 1 또는 0이어야합니까? 월, 년 또는 연도, 월, 일의 길이와 시간이 다른 이후의 차이에 대해서도 비슷한 문제가 발생합니다 (예 : 일광 절약 시간이 평소보다 1 시간 짧고 낮보다 2 시간 짧습니다). 끝났어).

다음은 시간을 무시하는 요일 차이, 즉 위의 날짜가 1을 반환하는 함수입니다.

/*
   Get the number of days between two dates - not inclusive.

   "between" does not include the start date, so days
   between Thursday and Friday is one, Thursday to Saturday
   is two, and so on. Between Friday and the following Friday is 7.

   e.g. getDaysBetweenDates( 22-Jul-2011, 29-jul-2011) => 7.

   If want inclusive dates (e.g. leave from 1/1/2011 to 30/1/2011),
   use date prior to start date (i.e. 31/12/2010 to 30/1/2011).

   Only calculates whole days.

   Assumes d0 <= d1
*/
function getDaysBetweenDates(d0, d1) {

  var msPerDay = 8.64e7;

  // Copy dates so don't mess them up
  var x0 = new Date(d0);
  var x1 = new Date(d1);

  // Set to noon - avoid DST errors
  x0.setHours(12,0,0);
  x1.setHours(12,0,0);

  // Round to remove daylight saving errors
  return Math.round( (x1 - x0) / msPerDay );
}

더 간결 할 수 있습니다.

/*  Return number of days between d0 and d1.
**  Returns positive if d0 < d1, otherwise negative.
**
**  e.g. between 2000-02-28 and 2001-02-28 there are 366 days
**       between 2015-12-28 and 2015-12-29 there is 1 day
**       between 2015-12-28 23:59:59 and 2015-12-29 00:00:01 there is 1 day
**       between 2015-12-28 00:00:01 and 2015-12-28 23:59:59 there are 0 days
**        
**  @param {Date} d0  - start date
**  @param {Date} d1  - end date
**  @returns {number} - whole number of days between d0 and d1
**
*/
function daysDifference(d0, d1) {
  var diff = new Date(+d1).setHours(12) - new Date(+d0).setHours(12);
  return Math.round(diff/8.64e7);
}

// Simple formatter
function formatDate(date){
  return [date.getFullYear(),('0'+(date.getMonth()+1)).slice(-2),('0'+date.getDate()).slice(-2)].join('-');
}

// Examples
[[new Date(2000,1,28), new Date(2001,1,28)],  // Leap year
 [new Date(2001,1,28), new Date(2002,1,28)],  // Not leap year
 [new Date(2017,0,1),  new Date(2017,1,1)] 
].forEach(function(dates) {
  document.write('From ' + formatDate(dates[0]) + ' to ' + formatDate(dates[1]) +
                 ' is ' + daysDifference(dates[0],dates[1]) + ' days<br>');
});


1
@rudeovskizebear는 IE, Firefox 및 Safari에서 테스트되었으며 정상적으로 작동합니다. 그것은 어떤 브라우저에서도 작동 할 것으로 예상되는 기본 ECMAScript를 사용합니다.
RobG

나는 테스트 페이지에 넣어, 그리고 크롬에 벌금을했다,하지만 난 IE9에서 점점 널 다시 최신 FF 유지
mnsr

@ RafiB.— 하나가 다른 것보다 더 정확하다고 생각하는 것은 확실하지 않습니다. UTC 시간 값을 사용하여 하루 종일 차이를 계산합니다. 질문의 모호성은 명확하지 않았다. 그렇다면 다른 솔루션으로 이어질 수 있습니다.
RobG

@RobG보다 간결한 솔루션의 의견에서 예제를 편집하십시오. 달은 '22'가 아닌 '12'여야합니다.
S.aad

1
@ IgorKudryashov— 죄송합니다. 2000 년은 윤년이므로 2000 년 2 월 28 일부터 2001 년 2 월 28 일은 366 일입니다. 윤년이 아닌 해에는 365 일입니다. 몇 가지 예를 더 추가했습니다.
RobG

18
<html lang="en">
<head>
<script>
function getDateDiff(time1, time2) {
  var str1= time1.split('/');
  var str2= time2.split('/');

  //                yyyy   , mm       , dd
  var t1 = new Date(str1[2], str1[0]-1, str1[1]);
  var t2 = new Date(str2[2], str2[0]-1, str2[1]);

  var diffMS = t1 - t2;    
  console.log(diffMS + ' ms');

  var diffS = diffMS / 1000;    
  console.log(diffS + ' ');

  var diffM = diffS / 60;
  console.log(diffM + ' minutes');

  var diffH = diffM / 60;
  console.log(diffH + ' hours');

  var diffD = diffH / 24;
  console.log(diffD + ' days');
  alert(diffD);
}

//alert(getDateDiff('10/18/2013','10/14/2013'));
</script>
</head>
<body>
  <input type="button" 
       onclick="getDateDiff('10/18/2013','10/14/2013')" 
       value="clickHere()" />

</body>
</html>

나에게 도움이되지 않습니다. 동일한 접근 방식으로 이것을 몇 개월 또는 몇 년으로 연장 할 수 없습니다.
tomazahlin

9

Moment.js 사용모든 JavaScript 관련 날짜-시간 계산에

귀하의 질문에 대한 답변은 다음과 같습니다

var a = moment([2007, 0, 29]);   
var b = moment([2007, 0, 28]);    
a.diff(b) // 86400000  

자세한 내용은 여기를 참조 하십시오


4
그리고 단순한 날짜 차이를 위해 여분의 400+ Kb를 수용하십시오.
Romeo Mihalcea

@RomeoMihalcea 하나의 로케일로 현재 축소 된 moment.js 2.22.2는 53KB, 17KB입니다. 그래도 귀하의 우려를 이해합니다. 하나의 간단한 기능에 사용할 수있는 거대한 라이브러리이지만 많은 날짜 / 시간 관련 문제를 처리하여 종종 가치가 있습니다.
HeikoS

8
function DateDiff(date1, date2) {
    date1.setHours(0);
    date1.setMinutes(0, 0, 0);
    date2.setHours(0);
    date2.setMinutes(0, 0, 0);
    var datediff = Math.abs(date1.getTime() - date2.getTime()); // difference 
    return parseInt(datediff / (24 * 60 * 60 * 1000), 10); //Convert values days and return value      
}

솔루션 주셔서 감사합니다 :)
bhagirathi

내가 찾은 대부분의 솔루션이 작동하지 않거나 너무 오래 감았습니다. 귀하의 솔루션은 지금까지 가장 단순하며 의도 한대로 정확하게 작동합니다! 건배 :)
브루스

1 시간보다 정확한 차이를 알고 싶다면 어떻게해야합니까? 포스트 질문에는 몇 시간과 초가 있습니다.이 모든 제로 설정에는 어떤 것이 있습니까?
2oppin


6
var d1=new Date(2011,0,1); // jan,1 2011
var d2=new Date(); // now

var diff=d2-d1,sign=diff<0?-1:1,milliseconds,seconds,minutes,hours,days;
diff/=sign; // or diff=Math.abs(diff);
diff=(diff-(milliseconds=diff%1000))/1000;
diff=(diff-(seconds=diff%60))/60;
diff=(diff-(minutes=diff%60))/60;
days=(diff-(hours=diff%24))/24;

console.info(sign===1?"Elapsed: ":"Remains: ",
             days+" days, ",
             hours+" hours, ",
             minutes+" minutes, ",
             seconds+" seconds, ",
             milliseconds+" milliseconds.");

4

죄송하지만 플랫 밀리 초 계산은 신뢰할 수 없습니다 모든 답변에 감사드립니다. 그러나 시도한 기능 중 일부가 1에서 실패했습니다. 오늘 날짜 근처의 날짜 2. 1970 년 날짜 또는 3 년. 윤년 날짜.

나에게 가장 잘 맞는 접근법은 윤년, 1970 년의 가까운 날짜, 2 월 29 일 등 모든 시나리오를 다룹니다.

var someday = new Date("8/1/1985");
var today = new Date();
var years = today.getFullYear() - someday.getFullYear();

// Reset someday to the current year.
someday.setFullYear(today.getFullYear());

// Depending on when that day falls for this year, subtract 1.
if (today < someday)
{
    years--;
}
document.write("Its been " + years + " full years.");

3

moment.js를 사용하는 경우 날짜 차이를 찾는 것이 매우 간단합니다.

var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";

moment.utc(moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss")

3
function DateDiff(b, e)
{
    let
        endYear = e.getFullYear(),
        endMonth = e.getMonth(),
        years = endYear - b.getFullYear(),
        months = endMonth - b.getMonth(),
        days = e.getDate() - b.getDate();
    if (months < 0)
    {
        years--;
        months += 12;
    }
    if (days < 0)
    {
        months--;
        days += new Date(endYear, endMonth, 0).getDate();
    }
    return [years, months, days];
}

[years, months, days] = DateDiff(
    new Date("October 21, 1980"),
    new Date("July 11, 2017")); // 36 8 20

3

나는 이것이해야한다고 생각합니다.

let today = new Date();
let form_date=new Date('2019-10-23')
let difference=form_date>today ? form_date-today : today-form_date
let diff_days=Math.floor(difference/(1000*3600*24))

2

이를 통해 프레임 워크없이 날짜 간 차이를 구현할 수 있습니다.

function getDateDiff(dateOne, dateTwo) {
        if(dateOne.charAt(2)=='-' & dateTwo.charAt(2)=='-'){
            dateOne = new Date(formatDate(dateOne));
            dateTwo = new Date(formatDate(dateTwo));
        }
        else{
            dateOne = new Date(dateOne);
            dateTwo = new Date(dateTwo);            
        }
        let timeDiff = Math.abs(dateOne.getTime() - dateTwo.getTime());
        let diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24));
        let diffMonths = Math.ceil(diffDays/31);
        let diffYears = Math.ceil(diffMonths/12);

        let message = "Difference in Days: " + diffDays + " " +
                      "Difference in Months: " + diffMonths+ " " + 
                      "Difference in Years: " + diffYears;
        return message;
     }

    function formatDate(date) {
         return date.split('-').reverse().join('-');
    }

    console.log(getDateDiff("23-04-2017", "23-04-2018"));

1

function daysInMonth (month, year) {
    return new Date(year, month, 0).getDate();
}
function getduration(){

let A= document.getElementById("date1_id").value
let B= document.getElementById("date2_id").value

let C=Number(A.substring(3,5))
let D=Number(B.substring(3,5))
let dif=D-C
let arr=[];
let sum=0;
for (let i=0;i<dif+1;i++){
  sum+=Number(daysInMonth(i+C,2019))
}
let sum_alter=0;
for (let i=0;i<dif;i++){
  sum_alter+=Number(daysInMonth(i+C,2019))
}
let no_of_month=(Number(B.substring(3,5)) - Number(A.substring(3,5)))
let days=[];
if ((Number(B.substring(3,5)) - Number(A.substring(3,5)))>0||Number(B.substring(0,2)) - Number(A.substring(0,2))<0){
days=Number(B.substring(0,2)) - Number(A.substring(0,2)) + sum_alter
}

if ((Number(B.substring(3,5)) == Number(A.substring(3,5)))){
console.log(Number(B.substring(0,2)) - Number(A.substring(0,2)) + sum_alter)
}

time_1=[]; time_2=[]; let hour=[];
 time_1=document.getElementById("time1_id").value
 time_2=document.getElementById("time2_id").value
  if (time_1.substring(0,2)=="12"){
     time_1="00:00:00 PM"
  }
if (time_1.substring(9,11)==time_2.substring(9,11)){
hour=Math.abs(Number(time_2.substring(0,2)) - Number(time_1.substring(0,2)))
}
if (time_1.substring(9,11)!=time_2.substring(9,11)){
hour=Math.abs(Number(time_2.substring(0,2)) - Number(time_1.substring(0,2)))+12
}
let min=Math.abs(Number(time_1.substring(3,5))-Number(time_2.substring(3,5)))
document.getElementById("duration_id").value=days +" days "+ hour+"  hour " + min+"  min " 
}
<input type="text" id="date1_id" placeholder="28/05/2019">
<input type="text" id="date2_id" placeholder="29/06/2019">
<br><br>
<input type="text" id="time1_id" placeholder="08:01:00 AM">
<input type="text" id="time2_id" placeholder="00:00:00 PM">
<br><br>
<button class="text" onClick="getduration()">Submit </button>
<br><br>
<input type="text" id="duration_id" placeholder="days hour min">


이 코드는 며칠, 시간, 심지어 분에 대한 정확한 결과를 제공합니다
Maximus Su

여러분이 그것을 사용하기를 바랍니다
Maximus Su

0

네, 그렇게 할 수있는 방법이 많이 있습니다. 예, 평범한 오래된 JS를 사용할 수 있습니다. 단지 시도:

let dt1 = new Date()
let dt2 = new Date()

Date.prototype.setMinutes를 사용하여 통과를 모방하고 범위 내에 있는지 확인하십시오.

dt1.setMinutes(7)
dt2.setMinutes(42)
console.log('Elapsed seconds:',(dt2-dt1)/1000)

또는 js-joda 와 같은 일부 라이브러리를 사용할 수 있습니다.이 라이브러리에서 다음과 같이 쉽게 할 수 있습니다 (직접 문서에서).

var dt1 = LocalDateTime.parse("2016-02-26T23:55:42.123");
var dt2 = dt1
  .plusYears(6)
  .plusMonths(12)
  .plusHours(2)
  .plusMinutes(42)
  .plusSeconds(12);

// obtain the duration between the two dates
dt1.until(dt2, ChronoUnit.YEARS); // 7
dt1.until(dt2, ChronoUnit.MONTHS); // 84
dt1.until(dt2, ChronoUnit.WEEKS); // 356
dt1.until(dt2, ChronoUnit.DAYS); // 2557
dt1.until(dt2, ChronoUnit.HOURS); // 61370
dt1.until(dt2, ChronoUnit.MINUTES); // 3682242
dt1.until(dt2, ChronoUnit.SECONDS); // 220934532

c 라이브러리는 훨씬 더 많지만 js-joda는 Java에서도 사용할 수있는 추가 보너스를 얻었으며 광범위하게 테스트되었습니다. 이러한 모든 테스트는 js-joda로 마이그레이션되었으며 변경 불가능합니다.


-1

JavaScript가 시간에 프레임을 사용하기 때문에 종료 시간을 얻을 수 있기 때문에 이것은 남은 시간을 표시 해야하는 경우에만 잘 작동합니다. 종료 시간-이후 RN은 1000 프레임 = 1 초이므로 1000으로 나눌 수 있습니다. 그 후에는 기본적인 수학 시간을 사용할 수 있지만 계산에 정적이기 때문에이 코드에는 여전히 문제가 있습니다. 연도의 다른 일 총계 (360/365/366)를 보상 할 수는 없습니다. 계산 후 시간이 0보다 작 으면 null로 만드는 것이라면 정확하게 묻는 것이 아니지만 도움이되기를 바랍니다. :)

var now = new Date();
var end = new Date("End Time");
var total = (end - now) ;
var totalD =  Math.abs(Math.floor(total/1000));

var years = Math.floor(totalD / (365*60*60*24));
var months = Math.floor((totalD - years*365*60*60*24) / (30*60*60*24));
var days = Math.floor((totalD - years*365*60*60*24 - months*30*60*60*24)/ (60*60*24));
var hours = Math.floor((totalD - years*365*60*60*24 - months*30*60*60*24 - days*60*60*24)/ (60*60));
var minutes = Math.floor((totalD - years*365*60*60*24 - months*30*60*60*24 - days*60*60*24 - hours*60*60)/ (60));
var seconds = Math.floor(totalD - years*365*60*60*24 - months*30*60*60*24 - days*60*60*24 - hours*60*60 - minutes*60);

var Y = years < 1 ? "" : years + " Years ";
var M = months < 1 ? "" : months + " Months ";
var D = days < 1 ? "" : days + " Days ";
var H = hours < 1 ? "" : hours + " Hours ";
var I = minutes < 1 ? "" : minutes + " Minutes ";
var S = seconds < 1 ? "" : seconds + " Seconds ";
var A = years == 0 && months == 0 && days == 0 && hours == 0 && minutes == 0 && seconds == 0 ? "Sending" : " Remaining";

document.getElementById('txt').innerHTML = Y + M + D + H + I + S + A;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.