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

Javascript 当解析格式错误的日期时,moment.js会做一些奇怪的事情,javascript,date,momentjs,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(my

如果我将
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

我在不同的浏览器上也看到了不同的结果。根据报告:

。。。我们首先检查字符串是否匹配已知的ISO 8601格式,如果找不到已知格式,则返回到
新日期(字符串)

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

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

console.log(date.getYear()); // -> NaN
console.log(date.getMonth()); // -> NaN
console.log(date.getDay()); // -> NaN

事实证明有一个严格的选项。从:

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


我试图回答这个问题,但我不得不放弃,因为我发现从2001年1月到12月1日,Moment将
Moment('foo-bar-17')
视为无效,而
Moment('foo-bar-1')
一直到
Moment('foo-bar-12')
。我不确定你看到了什么不同的结果,但这可能与此有关。谢谢詹姆斯。发现解析有一个“严格”选项。把我的答案贴在下面。
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