web-dev-qa-db-ja.com

Moment.jsを使用して期間を正確にフォーマットするにはどうすればよいですか?

UTC形式の2つの日付を前提として、次のことを行います。

_var start = "2014-01-13T06:00:00.0000000Z";
var end = "2014-01-13T14:16:04.0000000Z";
_

これらの2つの時間の間を通過する正確な期間を取得したいのですが、

_8h 16m
_

私は以下を使用してみました:

_var duration = moment(moment(end) - moment(start)).format('hh[h] mm[m]');
_

しかし、これは日では機能しません。さらに、24時間未満が経過しても、日は常に> = 1であるため、日では機能しません。

また、長さを取得するためにtwix.jsを試しましたが、そのフォーマットは上記で指定されたフォーマットの作成をサポートしていないか、ドキュメントでその方法を見つけることができませんでした。基本的に私はtwix.humanizeLength()exactバージョンを探しています。

Moment.jsa.diff(b)は合計期間のみを提供します。これにより、期間の長さを分、時間、または日で指定できますが、余りを使用して計算することはできません。

私の現在の解決策は、diffを使用して範囲を作成し、モジュロを使用して剰余を計算することですが、これはあまりエレガントではありません。

_var days = moment(end).diff(start, 'days');
var hours = moment(end).diff(start, 'hours') % 24;
var minutes = moment(end).diff(start, 'minutes') % 60;

var duration = ((days > 0) ? days + 'd ' : '') + ((hours > 0) ? hours + 'h ' : '') + ((minutes > 0) ? minutes + 'm ' : ''); 
_

質問:これを行うためのよりスマートな方法はmoment.jsまたはtwix.jsのいずれかですか、それとも時間をかけて開発する必要がありますか?私自身のmoment.jsプラグイン?

9
ane

Moment.jsに期間をフォーマットするためのプラグインがあります: moment-duration-format

必要な処理が行われない場合は、moment.duration.fnを拡張する必要があります。多くのロケールをサポートしていない場合は、十分に簡単なはずです。

いずれにせよ、このスレッドを読むことをお勧めします 機能リクエスト

4
Denys Séguret

期間を使用してみることができますが、それらが探している機能を備えているかどうかはわかりません http://momentjs.com/docs/#/durations/

また、いつでもモーメントの差分を使用してミリ秒単位で差を取得し、必要に応じてフォーマットすることができます。基本的には同じですが、diffを呼び出すのは1回だけです。

function convertMilliSecondsIntoLegibleString(milliSecondsIn) {

    var secsIn = milliSecondsIn / 1000;
    var milliSecs = milliSecondsIn % 1000;

    var hours = secsIn / 3600,
    remainder = secsIn % 3600,
    minutes = remainder / 60,
    seconds = remainder % 60;


    return ( hours + "h: "
            +  minutes + "m: "
            + seconds +"s: " + milliSecs + "ms");
}
5
jorge.alonso