web-dev-qa-db-ja.com

無効な日付「2013-10-311」を検証するmoment.js

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

15
Graham Charles

momentjsからGitリポジトリにIssueを作成します https://github.com/moment/moment/ このエラーを処理する最良の方法。

2
squadwuschel

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
19
timrwood

ユーザーが日付を選択していない場合は、無効な日付として表示されています。間違っています。日付が表示されないか、選択されていない日付が表示されます。 moment.jsでこれを変更するには、無効な日付ではなくnodateに変更します。

0
user3856049