在解析格式错误的日期时,moment.js正在做一些奇怪的事情

sen*_*ett 7 javascript date momentjs

如果我指定YYYY-MM-17为moment.js的日期,则表示它是有效日期:

var myMoment = moment('YYYY-MM-17', 'YYYY-MM-DD');

console.log(myMoment.isValid()); // -> true

console.log(myMoment.get('year')); // -> 2017
console.log(myMoment.get('month')); // -> 0
console.log(myMoment.get('day')); // -> 0
Run Code Online (Sandbox Code Playgroud)

https://jsfiddle.net/seu6x3k3/3/

我也在不同的浏览器上看到不同的结果.根据文件:

...我们首先检查字符串是否与已知的ISO 8601格式匹配,然后new Date(string)如果找不到已知格式则返回.

这不是我所看到的.使用相同格式本机指定日期时:

var date = new Date('YYYY-MM-17'); // -> NaN

console.log(date.getYear()); // -> NaN
console.log(date.getMonth()); // -> NaN
console.log(date.getDay()); // -> NaN
Run Code Online (Sandbox Code Playgroud)

https://jsfiddle.net/3p5x1qn3/

sen*_*ett 1

事实证明有一个严格的选择。来自文档

Moment 的解析器非常宽容,这可能会导致不良行为。从版本 2.3.0 开始,您可以为最后一个参数指定一个布尔值,以使 Moment 使用严格的解析。严格的解析要求格式和输入完全匹配。

var myMoment = moment('YYYY-MM-17', 'YYYY-MM-DD', true);

console.log(myMoment.isValid()); // -> false

console.log(myMoment.get('year')); // -> 2016
console.log(myMoment.get('month')); // -> 4
console.log(myMoment.get('day')); // -> 0
Run Code Online (Sandbox Code Playgroud)

https://jsfiddle.net/seu6x3k3/5/