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


246

나는 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 일 수 있습니다.


2
"하지만 나는 날짜가 마음에 들지 않는다"고 확신했다 : P이 글을 읽은 적이있다 : nodatime.org/unstable/userguide/trivia.html ?
보리스 칼 렌스

답변:


367

이 방법은 총 시간이 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"

31
@TML-24 시간 이상 작동하지 않을 것이라고 분명히 말했습니다.
Matt Johnson-Pint

1
이것은 잘 작동했습니다. momentjs는 매우 우아한 라이브러리입니다. 더 간단한 방법은 없지만 제가하고있는 일이 "정상적인"것이 아니라는 사실에 놀랍니다. 아마 24 시간을 넘지 못할 것입니다. 그러나 옵션이 있다면 좋을 것입니다. 당신의 도움을 주셔서 감사합니다.
Leo

69

문제는 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 과 같은 것을 고려하고 싶을 것입니다. :)


4
asHours대신에 를 사용 hours하고 소수점을 빼야합니다. 그렇지 않으면 그것은 내 대답에서 잡은 것과 같은 문제가있을 것입니다. :)
Matt Johnson-Pint

humanize ()는 멋진 터치를 제공하지만 결국 Matt 제안을 사용했습니다. 팁 고마워.
Leo

@MattJohnson-.asHours와 .hours가 다르다는 것을 깨닫지 못했음을 지적 해 주셔서 감사합니다. 하나는 다른 이름의 짧은 이름이지만 더 자세히 살펴보면 정확합니다.
TML

2
[Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')원하는 결과를 얻으려면 다음을 사용하는 것이 좋습니다 . 첫 부분에 소수점이없는 경우
KyleM

63
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/ 에서 더 많은 것을보십시오


3
이것은 날짜에 대해서만 작동합니다. 영업 이익은 시차를하고 싶어
apfz

이것은 가장 간단한 해결책입니다. 예, 타임 스탬프도 있습니다.
Faheem

30

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

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 분입니다.


19

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

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

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


11

이것은 잘 작동합니다.

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());

더 나은 솔루션! :)
JHenry

최고의 솔루션
Alaksandar Jesus Gene

9

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

4
나는 당신의 대답이 어디에서나 순간 사용량을 보지 못합니다.
Joel


3

대신에

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

하는 것이 낫다

moment.utc(total.asMilliseconds()).format("HH:mm:ss");

2

ES8에서 지금 moment를 사용하고 moment 객체가되기 시작하십시오.

const duration = moment.duration(now.diff(start));
const timespan = duration.get("hours").toString().padStart(2, '0') +":"+ duration.get("minutes").toString().padStart(2, '0') +":"+ duration.get("seconds").toString().padStart(2, '0');

2

Typescript : 다음이 작동해야합니다.

export const getTimeBetweenDates = ({
  until,
  format
}: {
  until: number;
  format: 'seconds' | 'minutes' | 'hours' | 'days';
}): number => {
  const date = new Date();
  const remainingTime = new Date(until * 1000);
  const getFrom = moment([date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()]);
  const getUntil = moment([remainingTime.getUTCFullYear(), remainingTime.getUTCMonth(), remainingTime.getUTCDate()]);
  const diff = getUntil.diff(getFrom, format);
  return !isNaN(diff) ? diff : null;
};

0

typescript로 간단한 함수를 만듭니다.

const diffDuration: moment.Duration = moment.duration(moment('2017-09-04 12:55').diff(moment('2017-09-02 13:26')));
setDiffTimeString(diffDuration);

function setDiffTimeString(diffDuration: moment.Duration) {
  const str = [];
  diffDuration.years() > 0 ? str.push(`${diffDuration.years()} year(s)`) : null;
  diffDuration.months() > 0 ? str.push(`${diffDuration.months()} month(s)`) : null;
  diffDuration.days() > 0 ? str.push(`${diffDuration.days()} day(s)`) : null;
  diffDuration.hours() > 0 ? str.push(`${diffDuration.hours()} hour(s)`) : null;
  diffDuration.minutes() > 0 ? str.push(`${diffDuration.minutes()} minute(s)`) : null;
  console.log(str.join(', '));
} 
// output: 1 day(s), 23 hour(s), 29 minute(s)

자바 스크립트 생성 https://www.typescriptlang.org/play/index.html


0

InTime = 06 : 38, 시간외 = 15 : 40

 calTimeDifference(){
        this.start = dailyattendance.InTime.split(":");
        this.end = dailyattendance.OutTime.split(":");
        var time1 = ((parseInt(this.start[0]) * 60) + parseInt(this.start[1]))
        var time2 = ((parseInt(this.end[0]) * 60) + parseInt(this.end[1]));
        var time3 = ((time2 - time1) / 60);
        var timeHr = parseInt(""+time3);
        var  timeMin = ((time2 - time1) % 60);
    }

0

날짜 시간 기반 입력

    var dt1 = new Date("2019-1-8 11:19:16");
    var dt2 = new Date("2019-1-8 11:24:16");


    var diff =(dt2.getTime() - dt1.getTime()) ;
    var hours = Math.floor(diff / (1000 * 60 * 60));
    diff -= hours * (1000 * 60 * 60);
    var mins = Math.floor(diff / (1000 * 60));
    diff -= mins * (1000 * 60);


    var response = {
        status : 200,
        Hour : hours,
        Mins : mins
    }

산출

{
"status": 200,
"Hour": 0,
"Mins": 5
}

0

순간을 이용한 EPOCH 시차 :

두 시대 사이의 차이를 얻으려면 :

통사론: moment.duration(moment(moment(date1).diff(moment(date2)))).asHours()

시간의 차이 : moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asHours()

분의 차이 : moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asMinutes().toFixed()

참고 :.toFixed() 정확한 값이 필요한 경우 제거 할 수 있습니다.

암호:

const moment = require('moment')

console.log('Date 1',moment(1590597909877).toISOString())
console.log('Date 2',moment(1590597744551).toISOString())
console.log('Date1 - Date 2 time diffrence is : ',moment.duration(moment(moment(1590597909877).diff(moment(1590597744551)))).asMinutes().toFixed()+' minutes')

https://repl.it/repls/MoccasinDearDimension의 실제 예제를 참조하십시오.

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