1. ホーム
  2. ジャバスクリプト

[解決済み】2つのデータタイム間の時差を取得する

2022-04-01 23:32:31

質問

私は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)…}

なぜ2番目の値がサマータイム(-0200)なのかはよくわかりませんが、私が日付好きでないことは確かです :(

更新2

まあ、値が-0200なのは、1969年12月31日がサマータイムが使われていた日だからだろう...ということですな。

解決方法は?

この方法は、合計時間が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() を別途用意する必要がありますが、ゼロパットも必要です。

をフォーマットする機能が必要なのです。 duration オブジェクトは、現在 moment.js にはありません。 ここで要求されている . しかし、サードパーティ製のプラグインで モーメント・デュレーション・フォーマット は、この目的に特化したものです。

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"