16

运行 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

更奇怪的是,如果您添加额外的格式选择,那么“剥离”将仅限于一个字符!(不应该对格式字符串测试进行 ORed 吗?)

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 (!!!)

这种行为是设计使然吗?我不明白为什么。

编辑:一位评论者发现了另一种情况,其中一个以外的额外字符确实被剥离了:

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 回答
0

如果用户没有选择任何日期,则显示为无效日期。这是错误的,它应该显示没有日期或未选择日期。要在 moment.js 中更改它,您可以将其更改为 nodate 而不是无效日期。

于 2015-01-08T09:42:18.910 回答