web-dev-qa-db-ja.com

Moment.jsが夏時間で日を追加する問題

Moment.jsで、次の問題が発生します。

1.私は瞬間の日付を作成します:

var m = moment(new Date(2014, 9, 18, 0, 0, 0));

2.toString関数を呼び出すと:

m.toString() //"Sat Oct 18 2014 00:00:00 GMT-0300"

3.今、私は次の出力がある日を追加します:

m.add("days",1).toString() //"Sat Oct 18 2014 00:00:00 GMT-0300"

私は再び18を取得しますか? Momentjsは日付を変更する必要があります。

編集:Chrome 32.0.1700.76mで発行

EDIT2:MomentJsバージョン2.5.1

EDIT3:タイムゾーンUTC-3

13
earnaz

私はあなたのコードを見ましたが、最初は同じ結果が得られませんでした。ただし、タイムゾーンをブラジル(GMT-03:00)に変更した場合-サンパウロでも同じ結果が得られました。これは明らかにバグであり、V8まで追跡され、報告されています。

プランカー

var m = moment(new Date(2014, 9, 18, 0, 0, 0));
console.log(m.toString());
console.log(m.add("days",1).toString());

2014年10月18日土曜日00:00:00GMT-0300 script.js:4

2014年10月18日土曜日00:00:00GMT-0300 script.js:5

バグを送信しました: https://github.com/moment/moment/issues/144

更新

Moment.jsはこのバグの責任を負いません。 V8のバグ(ChromeとNodeの両方で使用されるjavascriptエンジン))が追跡されています。ここでフォローできるV8のバグを報告しました: https:/ /code.google.com/p/v8/issues/detail?id=3116

これは、IsaacCambronがそれを追跡するために行った作業です。

OK、UbuntuとOSXの両方で再現されました(以前のテストでは別のブラジルの都市を使用していました)。 ChromeではなくNodeを使用していますが、私たちの目的ではV8はV8です。

moment([2014, 9, 18]).add(1, 'd').format(); //=> '2014-10-18T00:00:00-03:00'

問題は、モーメントが本質的にこれを行うことです:

var d = new Date(2014, 9, 18);
d.setDate(19);
d.toString(); // => Sat Oct 18 2014 23:00:00 GMT-0300 (BRT)
//wtf?

次に、時間をゼロに設定します。 V8は、特に10月19日に設定するように依頼したにもかかわらず、奇妙なことに10月18日の遅い時間に設定されているため、答えが間違っています。ここでのDST遷移はジャンプフォワードであるため、これはすべて特に奇妙です。つまり、前日の23:00ではなく1:00になるはずです。

実際、これも実行します。

new Date("October 18, 2014"); //=> Sat Oct 18 2014 00:00:00 GMT-0300 (BRT)
new Date("October 19, 2014"); //=> Sat Oct 18 2014 23:00:00 GMT-0300 (BRT)
16

以下のコードを使用して、moment.jsで次の日付を取得できます。

var date='2014/09/18';
var nextDate = moment(date, 'YYYY/MM/DD').add('days', 1).format('YYYY/MM/DD');
console.log(nextDate); // 2014/09/19

詳細については、以下のリンクをご覧ください

momentjs docs

3
Akalya

このjsFiddleによると、あなたがしていることは/すべき/機能しているはずです。どのブラウザでテストしていますか?

http://jsfiddle.net/mori57/Nq3KD/

var m = moment(new Date(2014, 9, 18, 0, 0, 0));
console.log(m.toString()); // Firebug output: Sat Oct 18 2014 00:00:00 GMT-0400
console.log(m.add("days",1).toString()); // output: Sun Oct 19 2014 00:00:00 GMT-0400
3

これはかなり古い投稿ですが、同じ問題でGoogle経由でここにアクセスしました。私が最終的に使用したのは次のコードでした。おそらくこれは他の誰かに役立つでしょう:

    var then = moment("23.07.2014", "DD.MM.YY");
    var before = moment.unix(then.unix()-86400); // 86400 seconds/day
    var after = moment.unix(then.unix()+86400);
1
Jan

最初に番号を渡し、次に「日」を渡す必要があります

var m = moment(new Date(2014, 9, 18, 0, 0, 0));
console.log(m.toString());
console.log(m.add(1, "days").toString());

Chromeバージョン50.0.2661.37ベータ-m(64ビット)でテスト済み

1
Memphis335

このような問題を回避するための一般的な注意事項(ご覧のとおり、doが発生し、ブラウザのバグが原因で発生することもあります):dayDateオブジェクトを使用すると、真夜中の代わりに正午(12h00)を渡す規則を設定できます( 00h00)Dateコンストラクターに移動し、表示する日付を準備する関数で、それを切り取ります。

ブラウザのバグ、およびDSTによる問題は、通常、時刻を1時間シフトします(時刻は前日の00h00から23h00に戻ります)。正午だけを使用する場合は、発生しないはずです(同様のバグの場合、たとえば、時刻は12:00から11:00に戻りますが、日は変わりません)。

(もちろん、日付は正午であることに注意する必要があります。日付が正しくない場合もあります)

たとえば、会社のアプリで使用していたYUIライブラリのこのバグを見てください。

https://github.com/yui/yui2/pull/15

これは、Firefox、Windows、特定のタイムゾーン、および特定の月にのみ発生しました。しかし、それは起こりました。

0
jakub.g