日期年份验证失败

Year of date validation is failing

本文关键字:失败 验证 日期      更新时间:2023-09-26

我需要做一个日期验证才能接受dd/mm/yyyy格式的它。但是,所有条件都正常工作,除了如果我输入 6 位数字的年份,它也接受它,例如 -

200000/12/12

根据我的代码是有效的。下面是我的代码:

function validate(value) {
            if(!value.match(/'d'd'/'d'd'/'d'd'd'd/))
                return false;
            return checkdate(value);
}
function checkdate(val)
{
    var dates = val.split(/'D/);
    if(dates[0] <= 0 || dates[0] > 31)
        return false;
    if(dates[1] <= 0 || dates[1] > 12)
        return false;
    var now = new Date(dates[2],dates[1]-1,dates[0]);
    if (isNaN(now))
        return false;
    now.setHours(0,0,0,0);
    if (now.getFullYear() == dates[2] && now.getMonth() + 1 == dates[1] && now.getDate() == dates[0])
        return true;
    return false;
}

我不确定为什么它允许年份作为 6 位有效输入?

问题出在validate函数中,它匹配的正则表达式允许你不想作为有效传递的输入值。除了明显的dd/mm/yyyy格式外,它还允许找到的文本位于字符串中的任何位置。基本上,你说让它检查"字符串中是否有所述表达式",而它应该是"如果整个字符串与此表达式匹配"。

要解决此问题,请在开头添加^,在末尾添加$^代表字符串开始,$代表字符串结束:

/^'d'd'/'d'd'/'d'd'd'd$/

我认为阅读有关JavaScript使用的正则表达式语法的文档会让您受益匪浅。

在at时,人类往往会在阅读类似字符的长重复序列时遇到问题,就像在你的正则表达式中一样。这个表达式更容易理解,并且做完全相同的事情:

/^'d{2}'/'d{2}'/'d{4}$/

您没有使用开始和停止分隔符限制正则表达式,因此12/12/200000匹配,因为它与正则表达式匹配,然后是一些

if (!value.match(/^'d'd'/'d'd'/'d'd'd'd$/) )

作为旁注,您不必键入'd四次,您可以执行'd{4}来匹配四个'd实例

如果要通过创建 Date 对象来验证日期字符串,则无需检查整个模式,只需创建 and Date 并检查结果即可。你真的需要两位数的日和月数吗?

如果你想要一个 4 位数的年份,则必须单独检查,因为构造函数会很乐意将两位数的年份转换为 20 世纪。如果您确实需要两位数的日和月,则可以与年份同时检查:

function validateDMY(s) {
  var b = s.split(/'D/);
  var d = new Date(b[2], --b[1], b[0]);
  return d && /^'d{4}$/.test(b[2]) && b[1] == d.getMonth();
}
console.log(validateDMY('30/02/2015')); // false
console.log(validateDMY('30/22/2015')); // false
console.log(validateDMY('02/02/15'));   // false
console.log(validateDMY('30/01/2015')); // true