Moment J에서 두 날짜의 시간 차이를 가져옵니다


385

MomentJ를 사용하여 두 날짜의 차이를 다음과 같이 얻을 수 있습니다.

moment(end.diff(startTime)).format("m[m] s[s]")

그러나 해당되는 경우 시간을 표시하고 싶습니다 (> = 60 분이 지난 경우에만).

그러나 다음을 사용하여 지속 시간을 검색하려고하면

var duration = moment.duration(end.diff(startTime));
var hours = duration.hours();

두 날짜 사이의 시간 수가 아닌 현재 시간을 반환합니다.

두 순간의 시간 차이를 어떻게 알 수 있습니까?

답변:


611

당신은 가까이있었습니다. duration.asHours()메소드 를 사용하기 만하면됩니다 ( docs 참조 ).

var duration = moment.duration(end.diff(startTime));
var hours = duration.asHours();

8
그렇지 startTime.diff(end, 'hours', true);않습니까? duration.asHours (); 25 시간 전이면 1을 반환합니다.
다니엘 F

29
@DanielF MomentJS> = 버전 2.0.0을 사용하는 경우 .diff(), 예를 사용할 수 있습니다 . end.diff(startTime, 'hours', true)시간 수를 양수로 얻는 것을 제외하고 . 그러나 두 번째 요점이 정확하지 않습니다. duration.hours()25 시간 전이면 1을 반환하지만 duration.asHours()25를 반환합니다.
GregL

5
@GregL 나는 스탠드 수정 jsfiddle.net/qxxr1Lyr 내가 잘못 사용해야합니다 .hours()몰래 방법.
Daniel F

5
OP가 오타를 인식하게하여 대부분의 IDE가 어쨌든 당신에게 공개 할 것이라는 오타를 인식하게 만드는 것입니다 ( imgur.com/a/ikyayIL ). 다른 사람들은 스크랩을 위해 일하는 동안 SO 담당자는 가장 잘 차려 입습니다. 오 당신은 오타를
고쳤습니다

3
@zanderwar 나는 당신의 좌절을 이해하지만 이것은 5 살짜리 질문입니다. 오늘날 그러한 질문과 답변은 날지 않을 것입니다.
Jean-François Fabre

218

다음 코드 블록은 MomentJS를 사용하여 두 날짜 사이의 일 수 차이를 계산하는 방법을 보여줍니다.

var now = moment(new Date()); //todays date
var end = moment("2015-12-1"); // another date
var duration = moment.duration(now.diff(end));
var days = duration.asDays();
console.log(days)

61
적어도 그의 코드 블록은 허용 된 답변이나 질문과 달리 사용중인 모든 변수를 보여주었습니다. 누군가 투표를 거부하려면 불완전한 코드 블록이므로 질문에 투표해야합니다. 이 코드 블록에는 실제로 설명이 필요합니까?
Jordan Papaleo

23
이 답변은 위의 허용되는 답변보다 명확하고 훨씬 완벽합니다. 여기서 'end'와 'startTime'의 출처를 모릅니다. 답변 해 주셔서 감사합니다. Raj!
Pierre

3
에 의해 얻는 것이 조금 더 간단합니다 var now = moment();. 참조 momentjs.com/docs/#/parsing/now
rob3c

161

아니면 간단하게 할 수 있습니다 :

var a = moment('2016-06-06T21:03:55');//now
var b = moment('2016-05-06T20:03:55');

console.log(a.diff(b, 'minutes')) // 44700
console.log(a.diff(b, 'hours')) // 745
console.log(a.diff(b, 'days')) // 31
console.log(a.diff(b, 'weeks')) // 4

문서 : 여기


11
모든 시간, 분 및 초를 함께 표시하려면 어떻게해야합니까? HH : MM : SS처럼?
Faizan Saiyed

16

hours모멘트 diff 기능에 대한 두 번째 매개 변수로 전달 하기 만하면됩니다.

var a = moment([21,30,00], "HH:mm:ss")
var b = moment([09,30,00], "HH:mm:ss")
a.diff(b, 'hours') // 12

문서 : https://momentjs.com/docs/#/displaying/difference/

예:

const dateFormat = "YYYY-MM-DD HH:mm:ss";
// Get your start and end date/times
const rightNow = moment().format(dateFormat);
const thisTimeYesterday = moment().subtract(1, 'days').format(dateFormat);
// pass in hours as the second parameter to the diff function
const differenceInHours = moment(rightNow).diff(thisTimeYesterday, 'hours');

console.log(`${differenceInHours} hours have passed since this time yesterday`);
<script 
  src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js">
</script>


12

다음 과 같이 사람이 읽을 수있는 좋은 형식으로 특정 시간에서 시간을 반환 하는 훌륭한 moment메소드 가 있습니다 fromNow().

moment('2019-04-30T07:30:53.000Z').fromNow() // an hour ago || a day ago || 10 days ago

또는 두 특정 날짜 사이에 원하는 경우 다음을 사용할 수 있습니다.

var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.from(b); // "a day ago"

문서에서 가져온 것 :


7

나는 이것이 오래된 것을 알고 있지만 여기에 하나의 라이너 솔루션이 있습니다.

const hourDiff = start.diff(end, "hours");

어디에서 시작끝은 순간 개체입니다.

즐겨!


... 2016 년 Sebastián Lara가 이미 제안 함
YakovL

2
 var start=moment(1541243900000);
 var end=moment(1541243942882);
 var duration = moment.duration(end.diff(startTime));
 var hours = duration.asHours();

보시다시피, 시작 및 종료 날짜는이 방법이 작동하기위한 모멘트 객체 여야했습니다.


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

1
var __startTime = moment("2016-06-06T09:00").format();
var __endTime = moment("2016-06-06T21:00").format();

var __duration = moment.duration(moment(__endTime).diff(__startTime));
var __hours = __duration.asHours();
console.log(__hours);

2
모멘트의 문자열 표현에 대한 불필요한 변환을 모두 제거하면 허용되는 답변으로 끝납니다.
Vladimir M

1
변수 이름의 시작 부분에 왜 추가 밑줄이 표시됩니까?
zenw0lf

1

필자의 경우 몇 시간과 몇 분이 필요했습니다.

var duration = moment.duration(end.diff(startTime));
var hours = duration.hours(); //hours instead of asHours
var minutes = duration.minutes(); //minutes instead of asMinutes

자세한 내용은 공식 문서를 참조하십시오 .


0

아래 코드에서보다 현명한 두 날짜 사이의 총 시간을 원한다면 시작 날짜 : 2018-05-04 02:08:05 , 종료 날짜 : 2018-05-14 09:04:07 ...

function countDaysAndTimes(startDate,endDate){
return new Promise(function (resolve, reject) {
var dayObj = new Object;
var finalArray = new Array;

var datetime1 = moment(startDate);
var datetime2 = moment(endDate);
if(datetime1.format('D') != datetime2.format('D') || datetime1.format('M') != datetime2.format('M') ||  datetime1.format('YYYY') != datetime2.format('YYYY')){
  var onlyDate1 = startDate.split(" ");
  var onlyDate2 = endDate.split(" ");
  var totalDays = moment(onlyDate2[0]).diff(moment(onlyDate1[0]), 'days')

  // First Day Entry
  dayObj.startDate = startDate;
  dayObj.endDate = moment(onlyDate1[0]).add(1, 'day').format('YYYY-MM-DD')+" 00:00:00";
  dayObj.minutes = moment(dayObj.endDate).diff(moment(dayObj.startDate), 'minutes');
  finalArray.push(dayObj);

  // Between Days Entry
  var i = 1;
  if(totalDays > 1){
    for(i=1; i<totalDays; i++){
      var dayObj1 = new Object;
      dayObj1.startDate = moment(onlyDate1[0]).add(i, 'day').format('YYYY-MM-DD')+" 00:00:00";
      dayObj1.endDate = moment(onlyDate1[0]).add(i+1, 'day').format('YYYY-MM-DD')+" 00:00:00";
      dayObj1.minutes = moment(dayObj1.endDate).diff(moment(dayObj1.startDate), 'minutes');
      finalArray.push(dayObj1);
    }
  }

  // Last Day Entry
  var dayObj2 = new Object;
  dayObj2.startDate = moment(onlyDate1[0]).add(i, 'day').format('YYYY-MM-DD')+" 00:00:00";
  dayObj2.endDate = endDate ;
  dayObj2.minutes = moment(dayObj2.endDate).diff(moment(dayObj2.startDate), 'minutes');
  finalArray.push(dayObj2);

}
else{
  dayObj.startDate = startDate;
  dayObj.endDate = endDate;
  dayObj.minutes = datetime2.diff(datetime1, 'minutes');
  finalArray.push(dayObj);
}
console.log(JSON.stringify(finalArray));
// console.table(finalArray);
resolve(finalArray);
});
}

산출

 [
  {
  "startDate":"2018-05-04 02:08:05",
  "endDate":"2018-05-05 00:00:00",
  "minutes":1311
  },
  {
  "startDate":"2018-05-05 00:00:00",
  "endDate":"2018-05-06 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-06 00:00:00",
  "endDate":"2018-05-07 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-07 00:00:00",
  "endDate":"2018-05-08 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-08 00:00:00",
  "endDate":"2018-05-09 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-09 00:00:00",
  "endDate":"2018-05-10 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-10 00:00:00",
  "endDate":"2018-05-11 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-11 00:00:00",
  "endDate":"2018-05-12 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-12 00:00:00",
  "endDate":"2018-05-13 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-13 00:00:00",
  "endDate":"2018-05-14 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-14 00:00:00",
  "endDate":"2018-05-14 09:04:07",
  "minutes":544
  }
 ]

0

나는 이것이 이미 답변 된 것을 알고 있지만 재귀적이고보다 일반적인 무언가를 원하고 순간에 의존하지 않는 fromNow경우 내가 만든이 기능을 사용할 수 있습니다. 물론 로직을 변경하여 년과 초를 지원해야 할 필요에 맞게 조정할 수도 있습니다.

var createdAt = moment('2019-05-13T14:23:00.607Z');
var expiresAt = moment('2019-05-14T14:23:00.563Z');

// You can also add years in the beginning of the array or seconds in its end
const UNITS = ["months", "weeks", "days", "hours", "minutes"]
function getValidFor (createdAt, expiresAt, unit = 'months') {
    const validForUnit = expiresAt.diff(createdAt, unit);
    // you could adjust the if to your needs 
    if (validForUnit > 1 || unit === "minutes") {
    return [validForUnit, unit];
  }
  return getValidFor(createdAt, expiresAt, UNITS[UNITS.indexOf(unit) + 1]);
}

-9
            var timecompare = {
            tstr: "",
            get: function (current_time, startTime, endTime) {
                this.tstr = "";
                var s = current_time.split(":"), t1 = tm1.split(":"), t2 = tm2.split(":"), t1s = Number(t1[0]), t1d = Number(t1[1]), t2s = Number(t2[0]), t2d = Number(t2[1]);

                if (t1s < t2s) {
                    this.t(t1s, t2s);
                }

                if (t1s > t2s) {
                    this.t(t1s, 23);
                    this.t(0, t2s);
                }

                var saat_dk = Number(s[1]);

                if (s[0] == tm1.substring(0, 2) && saat_dk >= t1d)
                    return true;
                if (s[0] == tm2.substring(0, 2) && saat_dk <= t2d)
                    return true;
                if (this.tstr.indexOf(s[0]) != 1 && this.tstr.indexOf(s[0]) != -1 && !(this.tstr.indexOf(s[0]) == this.tstr.length - 2))
                    return true;

                return false;

            },
            t: function (ii, brk) {
                for (var i = 0; i <= 23; i++) {
                    if (i < ii)
                        continue;
                    var s = (i < 10) ? "0" + i : i + "";
                    this.tstr += "," + s;
                    if (brk == i)
                        break;
                }
            }};

8
코드를 게시하는 대신 설명을 추가 할 수 있습니까?
Paul Floyd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.