2つの日時の時差を取得する


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.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)…}

2番目の値が夏時間(-0200)である理由はわかりませんが、日付が気に入らないと思います:(

アップデート2

まあ、値は-0200です。1969年12月31日が夏時間が使用された日付だったためと考えられます。


2
「しかし、私は日付が嫌いだと確信しています」:Pこれまでにこれを読んだことがありますか:nodatime.org/unstable/userguide/trivia.html
Boris Callens、2015

回答:


366

このアプローチは、合計時間が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時間以上ある場合、上記の方法で時間はゼロにリセットされるため、理想的ではありません。

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 2013

1
これはうまくいきました。momentjsは非常にエレガントなライブラリなので、もっと簡単な方法がないことに驚かされますが、おそらく私がやっていることはそれほど「普通」ではありません。私はたぶん24時間を超えないでしょうが、それが起こった場合のオプションがあるといいです。ご協力いただきありがとうございます。
レオ

69

あなたの問題は、それをフォーマットする前に、moment.duration()の結果をmoment()に戻すことです。その結果、moment()はUnixエポックとの相対時間として解釈します。

それはあなたが探しているフォーマットを正確に与えるわけではありませんが、

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

「40分」のような便利なフォーマットを提供します。その特定の書式設定に本当に興味がある場合は、新しい文字列を自分で作成する必要があります。安い方法は

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

どこvar diff = moment.duration(now.diff(then))。これは、1桁の値のゼロパディングを提供しません。そのためには、underscore.stringのようなものを検討する必要があるかもしれません-いくつかのゼロを追加するだけの長い道のりのように思えます。:)


4
asHours代わりに使用hoursして、小数を取り除く必要があります。そうでなければ、それはあなたが私の答えでつかまえたのと同じ問題を抱えているでしょう。:)
Matt Johnson-Pint 2013

humanize()は素晴らしいタッチを提供しますが、結局マットの提案を使用しました。先端をありがとう。
レオ

それを指摘してくれてありがとう、@ MattJohnson-私は.asHoursと.hoursが異なることに気付いていませんでした。
TML

2
注:[Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')目的の結果を得るために、以下を使用するのが賢明 です。最初の部分に小数なし
KyleM 2017


30

2つのタイムスタンプの合計日数、時間数、分数のみの違いが必要な場合は、月や年ではありません。

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の午前0時)のエポック/ Unix時間から(ミリ秒後)の日付が計算されます。これが、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

史上最高のソリューション
アラクサンダージーザスジェネ

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でモーメントを使用すると、今やモーメントオブジェクトになります。

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)

javascriptを生成するためhttps://www.typescriptlang.org/play/index.html


0

InTime = 06:38、Outtime = 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

MOMENTJSを使用したエポック時間差

2つのエポック時間の差を取得するには:

構文: 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.