Moment.jsの実行、2.2.1
moment("2010-10-319", ["YYYY-MM-DD"]).isValid()
...はtrue
を返し、momentオブジェクトは2010年10月31日に設定されます。パーサーはあらゆる種類の無関係な文字を削除しているようです。
moment("2010-10-31a", ["YYYY-MM-DD"]).isValid(); // true
不思議なことに、フォーマットの選択肢を追加すると、「ストリッピング」は1文字に制限されます。 (フォーマット文字列テストはOR演算されるべきではありませんか?)
moment("2010-10-319", ["MM/DD/YYYY", "MM-DD-YYYY", "YYYY-MM-DD"]).isValid(); // true
moment("2010-10-3199", ["MM/DD/YYYY", "MM-DD-YYYY", "YYYY-MM-DD"]).isValid(); // false (!!!)
この動作は仕様によるものですか?理由がわかりません。
編集:コメント投稿者は、1つを超える余分な文字が実際に削除される別のケースを発見しました:
moment("2010-10-319qr", ["MM/DD/YYYY", "MM-DD-YYYY", "YYYY-MM-DD"]).isValid(); // true (!)
これが実際の動作です: http://jsfiddle.net/grahampcharles/r42jg/6/ (新しいケースで更新)
momentjsからGitリポジトリにIssueを作成します https://github.com/moment/moment/ このエラーを処理する最良の方法。
Moment.jsバージョン2.3.0
厳密な解析を追加しました。
moment("2010-10-319", ["YYYY-MM-DD"]).isValid(); // true
moment("2010-10-319", ["YYYY-MM-DD"], true).isValid(); // false
moment("2010-10-31a", ["YYYY-MM-DD"]).isValid(); // true
moment("2010-10-31a", ["YYYY-MM-DD"], true).isValid(); // false
var formats = ["MM/DD/YYYY", "MM-DD-YYYY", "YYYY-MM-DD"];
moment("2010-10-319", formats).isValid(); // true
moment("2010-10-3199", formats).isValid(); // false
moment("2010-10-319", formats, true).isValid(); // false
moment("2010-10-3199", formats, true).isValid(); // false
moment("2010-10-319qr", formats).isValid(); // true
moment("2010-10-319qr", formats, true).isValid(); // false
ユーザーが日付を選択していない場合は、無効な日付として表示されています。間違っています。日付が表示されないか、選択されていない日付が表示されます。 moment.jsでこれを変更するには、無効な日付ではなくnodateに変更します。