MomentJS问题处理2月29日,而不是闰年

Kiw*_*nic 2 javascript momentjs

我正在对2013年12月36日(DD/MM/YYYY),2013年2月15日(DD/MM/YYYY)或以下具体案例的无效日期进行验证:

2009年2月29日(DD/MM/YYYY)无效,因为2009年不是闰年

代码是:

var momentAcceptedDateInputs = ['D/M/YY', 'DD/M/YY','D/MM/YY','DD/MM/YY'
, 'D/M/YYYY', 'DD/M/YYYY', 'D/MM/YYYY', 'DD/MM/YYYY',
'D MMM YY', 'DD MMM YY', 'D MMM YYYY', 'DD MMM YYYY'];

var parsedDate = moment(val, momentAcceptedDateInputs);
return parsedDate.isValid();
Run Code Online (Sandbox Code Playgroud)

输入值:

29/02/2009

对象的预期返回值:

  1. parsedDate.isValid():false
  2. parsedDate:时刻
    • _a:数组[7]
    • _d:Sun Feb 29 2009 00:00:00 GMT + 1300(新西兰夏令时)
    • _f:"D/M/YYYY"
    • _i:"29/02/2009"
    • _isUTC:false
    • _isValid:false

对象的实际返回值:

  1. parsedDate.isValid():true
  2. parsedDate:时刻
    • _a:数组[7]
    • _d:Sun Feb 29 1920 00:00:00 GMT + 1300(新西兰夏令时)
    • _f:"D/M/YY"
    • _i:"29/02/2009"
    • _isUTC:false
    • _isValid:是的

知道怎么解决这个问题吗?

我使用的是定制版本的moment.js版本:2.4.0

我定制的唯一规则是这样,所以我怀疑它会导致上面报告的错误:

datePartArray[YEAR] = toInt(input) + 
(toInt(input) > (moment(moment()).format("YY")) ? 1900 : 2000);
Run Code Online (Sandbox Code Playgroud)

Mat*_*int 7

默认情况下,Moment的解析器非常宽容.

例如:

moment("29/02/2009",'D/M/YY').isValid()  // true, because it uses year "20"
Run Code Online (Sandbox Code Playgroud)

您可以通过传递布尔值true来更改此值

moment("29/02/2009",'D/M/YY', true).isValid() // false, due to the year digits
Run Code Online (Sandbox Code Playgroud)

这是在文档中.