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

时间:2014-01-23 21:03:33

标签: javascript momentjs

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

29/02/2009 (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();

输入值:

29/02/2009

预期对象的返回值:

  1. parsedDate.isValid(): false
  2. parsedDate:时刻
    • _a:Array [7]
    • _d: Sun 2009年2月29日00:00:00 GMT + 1300(新西兰夏令时)
    • _f:“D / M / YYYY”
    • _i:“29/02/2009”
    • _isUTC:false
    • _isValid: false
  3. 实际对象的返回值:

    1. parsedDate.isValid(): true
    2. parsedDate:时刻
      • _a:Array [7]
      • _d: Sun 2月29日1920 00:00:00 GMT + 1300(新西兰夏令时)
      • _f:“D / M / YY”
      • _i:“29/02/2009”
      • _isUTC:false
      • _isValid: true
    3. 知道怎么解决这个问题吗?

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

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

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

2 个答案:

答案 0 :(得分:6)

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

例如:

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

您可以通过传递布尔值

来更改此值
moment("29/02/2009",'D/M/YY', true).isValid() // false, due to the year digits

This is in the documentation

答案 1 :(得分:1)

至于时刻-2.10.6,

 moment("29/02/2009", "DD/MM/YYYY").isValid();
即使没有严格的解析标志,

现在返回 false

此外,documentation表示可以通过“替换moment.parseTwoDigitYear方法”来自定义两位数年份的解析。

类似的东西:

var moment = require("moment");

var myMoment = module.exports = moment;

moment.parseTwoDigitYear = function(year) {
    return ((year > 20)? 1000:2000) + parseInt(year);
}

然后

myMoment = require('./myMoment');

date = myMoment("28/02/67", "DD/MM/YYYY");
console.log(date.year());

返回 1067 (不是 2067 )。