[javascript] 두 날짜 시간의 시차를 구하십시오.

나는 momentjs로 무엇이든 할 수 있고 더 많은 관련 날짜를 할 수 있다는 것을 알고 있습니다. 그러나 당황스럽게도, 나는 단순한 것처럼 보이는 것을 시도하는 데 어려움을 겪고 있습니다 : 2 번의 차이를 얻는 것.

예:

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

//expected result:
"00:39:30"

내가 시도한 것 :

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

console.log(moment(moment.duration(now.diff(then))).format("hh:mm:ss"))
//outputs 10:39:30  

나는 그 “10”이 무엇인지 이해하지 못한다. 나는 브라질에 살고 있으므로 관련이 있다면 utc-0300입니다.

결과 moment.duration(now.diff(then))는 올바른 내부 값이있는 기간입니다.

 days: 0
 hours: 0
 milliseconds: 0
 minutes: 39
 months: 0
 seconds: 30
 years: 0

그래서 내 질문은 : momentjs Duration을 시간 간격으로 변환하는 방법은 무엇입니까? 확실히 사용할 수 있습니다

duration.get("hours") +":"+ duration.get("minutes") +:+ duration.get("seconds")

그러나 나는 완전히 누락 된 더 우아한 것이 있다고 느낍니다 .

업데이트
위의 예에서, 가까이 찾고 now있습니다 :

Tue Apr 09 2013 15:00:00 GMT-0300 (E. South America Standard Time)…}

그리고 moment(moment.duration(now.diff(then))):

Wed Dec 31 1969 22:39:30 GMT-0200 (E. South America Daylight Time)…}

왜 두 번째 값이 일광 시간 (-0200)인지 확실하지 않지만 날짜가 마음에 들지 않을 것이라고 확신합니다. (

업데이트 2

1969 년 12 월 31 일은 일광 절약 시간이 사용 된 날짜이기 때문에 값이 -0200 일 수 있습니다.



답변

이 방법은 총 시간이 24 시간 미만인 경우에만 작동합니다.

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

// outputs: "00:39:30"

24 시간 이상인 경우 위의 방법으로 시간이 0으로 재설정되므로 이상적이지 않습니다.

24 시간 이상 유효한 응답을 얻으려면 다음과 같이해야합니다.

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

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);
var s = Math.floor(d.asHours()) + moment.utc(ms).format(":mm:ss");

// outputs: "48:39:30"

utc 시간을 바로 가기로 사용하고 있습니다. 당신은 당겨 수 d.minutes()d.seconds()별도로,하지만 당신은 그들을 zeropad해야합니다.

duration이의 제기 형식 을 지정할 수있는 기능 이 현재 moment.js에 있지 않기 때문에이 작업이 필요합니다 . 여기에 요청되었습니다 . 그러나이 목적을 위해 특별히 moment-duration-format 이라는 타사 플러그인 이 있습니다.

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

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);
var s = d.format("hh:mm:ss");

// outputs: "48:39:30"


답변

문제는 moment.duration ()의 결과를 형식화하기 전에 moment ()로 다시 전달하는 것입니다. 이로 인해 moment ()는 유닉스 시대와 관련된 시간으로 해석합니다.

원하는 형식을 정확하게 제공하지는 않지만

moment.duration(now.diff(then)).humanize()

“40 분”과 같은 유용한 형식을 제공합니다. 특정 형식에 관심이 있다면 직접 새 문자열을 작성해야합니다. 싼 방법은

[diff.asHours(), diff.minutes(), diff.seconds()].join(':')

어디서 var diff = moment.duration(now.diff(then))? 이것은 한 자릿수 값에 제로 패딩을 제공하지 않습니다. 그것을 위해, 당신은 underscore.string 과 같은 것을 고려하고 싶을 것입니다. 🙂


답변

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') //[days, years, months, seconds, ...]
//Result 1 

나를 위해 일했다

http://momentjs.com/docs/#/displaying/difference/ 에서 더 많은 것을보십시오


답변

두 개의 타임 스탬프를 총 일,시, 분으로 만 변경하려는 경우 월 및 년이 아닙니다.

var now  = "01/08/2016 15:00:00";
var then = "04/02/2016 14:20:30";
var diff = moment.duration(moment(then).diff(moment(now)));

diff에는 2 개월, 23 일, 23 시간 및 20 분이 포함됩니다. 그러나 우리는 일, 시간 및 분만에 결과가 필요하므로 간단한 해결책은 다음과 같습니다.

var days = parseInt(diff.asDays()); //84

var hours = parseInt(diff.asHours()); //2039 hours, but it gives total hours in given miliseconds which is not expacted.

hours = hours - days*24;  // 23 hours

var minutes = parseInt(diff.asMinutes()); //122360 minutes,but it gives total minutes in given miliseconds which is not expacted.

minutes = minutes - (days*24*60 + hours*60); //20 minutes.

최종 결과는 84 일, 23 시간, 20 분입니다.


답변

를 호출 diff하면 moment.js가 밀리 초 단위의 차이를 계산합니다. 밀리 초가에 전달되면 duration올바른 지속 시간을 계산하는 데 사용됩니다. 하나. 에 동일한 밀리 초를 전달하면 moment()1970 년 1 월 1 일 (자정 UTC / GMT) 인 에포크 / 유닉스 시간 (후)부터 밀리 초인 날짜를 계산합니다. 그렇기 때문에 당신은 1969 년을 잘못된 시간과 함께하게됩니다.

duration.get("hours") +":"+ duration.get("minutes") +":"+ duration.get("seconds")

그래서, 이것은 moment.js가 format기간 동안 기능을 제공하지 않기 때문에 이것이 당신이 해야하는 방법이라고 생각합니다 . 또는 간단한 래퍼를 작성하여 더 쉽고 더 예쁘게 만들 수 있습니다.


답변

이것은 잘 작동합니다.

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

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);

console.log(d.days(), d.hours(), d.minutes(), d.seconds());


답변

hh : mm : ss 만 원하면 다음과 같은 함수를 사용할 수 있습니다.

//param: duration in milliseconds
MillisecondsToTime: function(duration) {
    var seconds = parseInt((duration/1000)%60)
        , minutes = parseInt((duration/(1000*60))%60)
        , hours = parseInt((duration/(1000*60*60))%24)
        , days  = parseInt(duration/(1000*60*60*24));

    var hoursDays = parseInt(days*24);
    hours += hoursDays;
    hours = (hours < 10) ? "0" + hours : hours;
    minutes = (minutes < 10) ? "0" + minutes : minutes;
    seconds = (seconds < 10) ? "0" + seconds : seconds;
    return hours + ":" + minutes + ":" + seconds;
}