javascript日期验证未验证2月31日

时间:2014-01-17 14:36:38

标签: javascript validation

我正在尝试编写一些代码来验证表单数据。我有一个日期字段,应该有mm/dd/yyyy格式。我需要捕获例如 2月31日之类的异常,所以我添加了这段代码:

var d = new Date(dob);
if (isNaN(d.getTime())) { //this if is to take care of February 31, BUT IT DOESN'T!
  error = 1;
  message += "<li>Invalid Date</li>";
} else {
  var date_regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/;
  var validFormat = date_regex.test(dob);
  if (!(validFormat)) {
    error = 1;
    message += "<li>Invalid date format - date must have format mm/dd/yyyy</li>";
  }
}

但是我发现了一些非常奇怪的事情:当日期 02/32/2000 错误为无效日期时, 02/31/2000 却没有!

4 个答案:

答案 0 :(得分:30)

由于我在评论中所说的......

另一种检查日期是否有效的方法是检查传递给new Date函数的内容是否与出现的内容相同,如下所示:

// Remember that the month is 0-based so February is actually 1...
function isValidDate(year, month, day) {
    var d = new Date(year, month, day);
    if (d.getFullYear() == year && d.getMonth() == month && d.getDate() == day) {
        return true;
    }
    return false;
}

然后你可以这样做:

if (isValidDate(2013,1,31))

如果有效则返回true,如果无效,则返回false

答案 1 :(得分:1)

您是否可以使用图书馆?

我在Javascript中进行日期处理的第一个调用端口是moment.js:“用于解析,验证,操作和格式化日期的javascript日期库。”

答案 2 :(得分:1)

验证'mm / dd / yyyy'日期字符串的常用方法是创建日期对象并验证其月份和日期与输入相同。

function isvalid_mdy(s){
    var day, A= s.match(/[1-9][\d]*/g);
    try{
        A[0]-= 1;
        day= new Date(+A[2], A[0], +A[1]);
        if(day.getMonth()== A[0] && day.getDate()== A[1]) return day;
        throw new Error('Bad Date ');
    }
    catch(er){
        return er.message;
    }
}

<强> isvalid_mdy('02 /2000分之31' )

/ *返回值:(错误)错误日期* /

答案 3 :(得分:1)

Date .getMonth()(以及工作日为.getDay()的晦涩不清之后,我的脑袋被0-index(尽管年,日和其他所有情况都不像所以...哦,天哪...)我重新编写了Jeff的答案,以使它更易读和更友好-便于其他人从外部使用该方法。

ES6代码

您可以像往常一样将过去的月份称为1-indexed

我已经使用Number constructor解析了输入内容,因此可以使用strict equality更自信地比较值。

我正在使用UTC版本方法,以避免不得不处理本地时区。

此外,为了便于阅读,我将步骤分为几个变量。

/**
 *
 * @param { number | string } day
 * @param { number | string } month
 * @param { number| string } year
 * @returns { boolean }
 */
function validateDateString(day, month, year) {

    day = Number(day);
    month = Number(month) - 1; //bloody 0-indexed month
    year = Number(year);

    let d = new Date(year, month, day);

    let yearMatches = d.getUTCFullYear() === year;
    let monthMatches = d.getUTCMonth() === month;
    let dayMatches = d.getUTCDate() === day;

    return yearMatches && monthMatches && dayMatches;
}