如何防止JavaScript Date Constructor接受无效日期?

时间:2015-02-24 20:46:17

标签: javascript date

我意识到这可能是一个功能,但我需要Date Constructor在无效日期保释,而不是自动将其滚动到适当的日期。实现这一目标的最佳方法是什么?

new Date('02/31/2015');

变为

Tue Mar 03 2015 00:00:00 GMT-0500 (EST)

对不起,如果已经被问到这个问题,我找不到它太愚蠢了:)。

4 个答案:

答案 0 :(得分:2)

您似乎无法在非法日期强制失败。 MDN docs声明,观察到的行为应该仅在使用多于1个参数调用构造函数时发生,但这种情况似乎不成立(至少它不在chrome 40上)。

但是,您可以重新转换日期并将其与原始字符串进行比较:

var s = '02/31/2015';
var d = new Date(s)
var s_re = d.toLocaleDateString('en-US', { year: 'numeric', month: '2-digit', day: '2-digit' } );
if (s === s_re) {
    // ok
}

答案 1 :(得分:2)

如果您可以指望字符串输入被格式化为数字(没有工作日或月份名称),您可以在创建Date对象之前查看输入。

function validDate(s){
    //check for day-month order:
    var ddmm= new Date('12/6/2009').getMonth()=== 5;

    //arrange month,day, and year digits:

    var A= s.split(/\D+/).slice(0, 3), 
    month= ddmm? A[1]: A[0], 
    day= ddmm? A[0]: A[1], 
    y= A.pop(), 

    //figure february for given year:

    feb= y%4== 0 && (y%100 || y%400== 0)? 29: 28, 

    // set maximum days per month:

    mdays= [0, 31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

    //if the string is a valid calendar date, return a date object.
    //else return NaN (or throw an Error):

    return mdays[parseInt(month, 10)]-A[1]>= 0? new Date(s): NaN;
}

<强> validDate('02 / 29 / 2015' )

/ *返回值:(Number) 为NaN * /

答案 2 :(得分:2)

我最终使用moment.js。它具有其他Date对象增强功能中的验证和溢出计算。感谢Kevin Williams的

答案 3 :(得分:-1)

您无法将JavaScript Date对象设置为无效日期。

尽管如此,您可能需要check if a date is invalid