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
私はあなたのコードを見ましたが、最初は同じ結果が得られませんでした。ただし、タイムゾーンをブラジル(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)
以下のコードを使用して、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
詳細については、以下のリンクをご覧ください
この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
これはかなり古い投稿ですが、同じ問題で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);
最初に番号を渡し、次に「日」を渡す必要があります
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ビット)でテスト済み
このような問題を回避するための一般的な注意事項(ご覧のとおり、doが発生し、ブラウザのバグが原因で発生することもあります):dayDate
オブジェクトを使用すると、真夜中の代わりに正午(12h00)を渡す規則を設定できます( 00h00)Date
コンストラクターに移動し、表示する日付を準備する関数で、それを切り取ります。
ブラウザのバグ、およびDSTによる問題は、通常、時刻を1時間シフトします(時刻は前日の00h00から23h00に戻ります)。正午だけを使用する場合は、発生しないはずです(同様のバグの場合、たとえば、時刻は12:00から11:00に戻りますが、日は変わりません)。
(もちろん、日付は正午であることに注意する必要があります。日付が正しくない場合もあります)
たとえば、会社のアプリで使用していたYUIライブラリのこのバグを見てください。
https://github.com/yui/yui2/pull/15
これは、Firefox、Windows、特定のタイムゾーン、および特定の月にのみ発生しました。しかし、それは起こりました。