日付は、これら2つのセッターメソッドを使用して異なる方法で解析されます。
日付をOctober 31, 2015
設定する場合。 チェーンメソッドは2015-10-01
を返し、initメソッドは2015-10-31
返します
var year = 2015;
var month = 9; //october
var day = 31;
console.log(moment().date(day).month(month).year(year).format('YYYY-MM-DD'));
//2015-10-01
console.log(moment([year, month, day]).format('YYYY-MM-DD'));
//2015-10-31
JSフィドル: http :
これに注意してください
$('#chained').val(moment().year(2015).month(9).date(31).format('YYYY-MM-DD'));
2015-10-31
正しく返します
実際、モーメントはJS日付オブジェクトの動作を模倣しています。
まず、現在の日付(今日の11月3日)を示すmoment()
を作成します。 日を31
に設定しようとしましたが、11月は30日しかないため、JSネイティブの日付オブジェクトは「インテリジェントに」1日を追加し、日付を12月1日に移動します(42などの任意の狂った数に日を設定できます。 JSは、適切な日数を追加し、必要に応じて月と年を巻き戻すことによって計算を行います。ベストプラクティスではなく、スローする方がよいでしょう)。
解決策は、このような問題を回避、常に年、月、日、時、分をこの順序で設定することです。
オーバーフロー処理に関する事実は、実際に文書化されています。
http://momentjs.com/docs/#/get -set / date /
月の日を取得または設定します。
1から31までの数字を受け入れます。範囲を超えると、数か月までバブルします。
あなたのようなコーナーケースでの振る舞いは確かに驚くべきものですが。
この一般的な問題を説明するドキュメントリポジトリでPRを開きました
https://github.com/moment/momentjs.com/pull/244
ええ、これが修正可能かどうかはわかりません。 Momentは、あなたが月を設定しようとしていることを知らないので、現在の月に日を設定しようとします。これは、31である場合とない場合があります。それは、あなたの意図を認識していません。 @ jakub-gのドキュメントPRは良いと思います。 そうしよう。
最も参考になるコメント
これに注意してください
2015-10-31
正しく返します実際、モーメントはJS日付オブジェクトの動作を模倣しています。
まず、現在の日付(今日の11月3日)を示す
moment()
を作成します。 日を31
に設定しようとしましたが、11月は30日しかないため、JSネイティブの日付オブジェクトは「インテリジェントに」1日を追加し、日付を12月1日に移動します(42などの任意の狂った数に日を設定できます。 JSは、適切な日数を追加し、必要に応じて月と年を巻き戻すことによって計算を行います。ベストプラクティスではなく、スローする方がよいでしょう)。解決策は、このような問題を回避、常に年、月、日、時、分をこの順序で設定することです。