瞬間に期間を追加する(moment.js)


149

モーメントバージョン:2.0.0

ドキュメントを読んだ後、これは簡単だと思いました(Chromeコンソール):

var timestring1 = "2013-05-09T00:00:00Z";
var timestring2 = "2013-05-09T02:00:00Z";
var startdate = moment(timestring1);
var expected_enddate = moment(timestring2);
var returned_endate = startdate.add(moment.duration(2, 'hours'));
returned_endate == expected_enddate  // false
returned_endate  // Moment {_i: "2013-05-09T00:00:00Z", _f: "YYYY-MM-DDTHH:mm:ss Z", _l: undefined, _isUTC: false, _a: Array[7]…}

これはささいな例ですが、動作させることすらできません。ここで何か大きなものを見逃しているような気がしますが、本当にわかりません。これでもうまくいかないようです:

startdate.add(2, 'hours')
    // Moment {_i: "2013-05-09T00:00:00Z", _f: "YYYY-MM-DDTHH:mm:ss Z", _l: undefined, _isUTC: false, _a: Array[7]…}

どんな助けでも大歓迎です。

編集: 私の最終目標は、私がここで取り組んでいるようなバイナリステータスチャートを作成することです:http : //bl.ocks.org/phobson/5872894

ご覧のとおり、この問題を解決する間、現在ダミーのx値を使用しています。

回答:


264

ドキュメントの重要なポイントを逃したと思います .add()

時間を追加して元の瞬間を変化させます。

不変の結果を返す関数として扱っているようです。簡単に間違える。:)

戻り値を使用する場合、最初のオブジェクトと同じ実際のオブジェクトです。メソッドチェーニングの便宜として返されます。

ここで説明するように、瞬間を複製することでこの動作を回避できます

また、単に==テストに使用することはできません。毎回同じ出力にフォーマットして比較するか、.isSame()メソッドを使用することができます。

あなたのコードは今です:

var timestring1 = "2013-05-09T00:00:00Z";
var timestring2 = "2013-05-09T02:00:00Z";
var startdate = moment(timestring1);
var expected_enddate = moment(timestring2);
var returned_endate = moment(startdate).add(2, 'hours');  // see the cloning?
returned_endate.isSame(expected_enddate)  // true

マットさん、本当に感謝しています。それは多くのことを明らかにします。私がまだ理解できないことは次のとおりreturned_endateです。アクセス方法を知っているすべての表現は、午前2時ではなく、午前0時のままです。作業中のD3チャートを作成できるように、午前2時である必要があります(編集された質問を参照)。再度、感謝します。
ポールH

14
.format()or .toDate()やなどの表示メソッドの1つを呼び出していることを確認してください.unix()。生の瞬間を見るだけではうまくいきません。またyourmoment.utc().format()、ローカル時間ではなくutcとしてフォーマットするようなこともできます。
Matt Johnson-Pint 2013年

3
ええ、これらの瞬間は不変ではないことを忘れると、たまに時が来ます。いいね!
welbornio 2015

30

私はライブルートを追跡するアプリケーションに取り組んでいます。乗客は、ドライバーの現在の位置と彼/彼女の場所に到達するための予想到着時間を表示したいと考えています。そのため、現在の時間に期間を追加する必要があります。

だから私は同じことをする以下の方法を見つけました。現在の時間に任意の期間(時間、分、秒)を追加できます。

var travelTime = moment().add(642, 'seconds').format('hh:mm A');// it will add 642 seconds in the current time and will give time in 03:35 PM format

var travelTime = moment().add(11, 'minutes').format('hh:mm A');// it will add 11 mins in the current time and will give time in 03:35 PM format; can use m or minutes 

var travelTime = moment().add(2, 'hours').format('hh:mm A');// it will add 2 hours in the current time and will give time in 03:35 PM format

それは私の要件を満たしています。それはあなたを助けることができるかもしれません。


9
「分」ではなく「分」でなければなりません。
Tanvi Agarwal 2017年

2
「分」ではなく「分」である必要があります。または、少なくとも「m」にすることもできます。回答を更新してください!
Ulrich Dohou 2018年

1
私の回答ではすでに「分」であり、「分」の代わりに「m」を使用できることはすでに述べました(回答のコメントを参照)。私の答えを更新する必要はないと思います。
Mahima Agrawal

6

startTime(12h:30:30のような)とduration(120のような分単位の値)を持っている人は、次のendTimeように推測できます。

const startTime = '12:30:00';
const durationInMinutes = '120';

const endTime = moment(startTime, 'HH:mm:ss').add(durationInMinutes, 'minutes').format('HH:mm');

// endTime is equal to "14:30"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.