16

moment.js、2.2.1 の実行

moment("2010-10-319", ["YYYY-MM-DD"]).isValid()

... が返さtrueれ、その時点でオブジェクトが 2010 年 10 月 31 日に設定されます。パーサーは、あらゆる種類の不要な文字を削除するようです。

moment("2010-10-31a", ["YYYY-MM-DD"]).isValid(); // true

奇妙なことに、フォーマットの選択肢を追加すると、「ストリッピング」は 1 文字だけに制限されます! (フォーマット文字列のテストは論理和をとるべきではありませんか?)

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/ (新しいケースで更新)

4

3 に答える 3

21

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
于 2014-06-24T17:00:45.967 に答える
3

このエラーを処理する最善の方法は、momentjs https://github.com/moment/moment/から Git リポジトリに問題を作成することです。

于 2013-09-25T06:27:07.927 に答える