Javascript错误地验证日期

Javascript错误地验证日期,javascript,Javascript,我编写了一个函数来检查日期是否有效 除了一小部分,我写了所有的 功能不工作,我找不到错误,你能帮忙吗 我可以看到,因为数字29不在数组中,所以它不工作,但是我不知道如何让它工作 函数isValidDate(){ var dateformat=/^(0?[1-9]|[12][0-9]|[3[01])[-](0?[1-9]|[012])[-]\d{4}$/; var readDate=document.getElementById(“myDate”).value; 如果(readDate.leng

我编写了一个函数来检查日期是否有效

除了一小部分,我写了所有的

功能不工作,我找不到错误,你能帮忙吗

我可以看到,因为数字29不在数组中,所以它不工作,但是我不知道如何让它工作

函数isValidDate(){
var dateformat=/^(0?[1-9]|[12][0-9]|[3[01])[-](0?[1-9]|[012])[-]\d{4}$/;
var readDate=document.getElementById(“myDate”).value;
如果(readDate.length放弃所有这些

<input type="date" />
这是因为如果日期超出有效范围(例如,1月32日被更正为2月1日),JavaScript将“修复”日期,所以只需检查它在收到日期时是否更改了任何内容。

函数验证(值){
var v=假;
如果(值){
var r=value.match(/([0-9]{1,2})。?([0-9]{1,2})。?([0-9]{4})/;
if(r){
var day1=parseInt(r[1]);
var month1=parseInt(r[2]);
var year1=parseInt(r[3]);
var d=新日期(第1年,第1个月-1天);
var day2=d.getDate();
var month2=d.getMonth()+1;
var year2=d.getFullYear();
v=第1天==第2天&&
month1==month2&&
第1年=第2年;
}
}
返回v;
}

检查
  • 根据正则表达式测试日期您必须减少测试

  • 如果要继续,请不要返回
  • 下面是一个让代码尽可能接近您想要做的事情的解决方案。使用Date对象的更简单的解决方案我已经在一篇评论中建议过了,其他人已经详细介绍过了

    功能淋浴ROR(str){
    console.log(str)
    返回false;
    }
    函数isValidDate(){
    var dateformat=/^(0?[1-9]|[12][0-9]|[3[01])[-](0?[1-9]|[012])[-]\d{4}$/;
    var readDate=document.getElementById(“myDate”).value;
    如果(readDate.length!=10)返回错误(“无效日期长度”)//长度不正确
    log(dateformat.test(readDate));
    如果(!dateformat.test(readDate)){
    返回错误(“无效日期格式”)//与正则表达式不匹配
    }
    /*将日期拆分为DD-MM-YYYY格式*/
    var splitDate=readDate.split('-');
    var day=splitDate[0];
    var月=拆分日期[1];
    var年=拆分日期[2];
    /*调试-将拆分日期打印为DD-MM-YYYY格式*/
    控制台日志('天'+天);
    console.log(“月”+月);
    控制台日志(年+年);
    //创建一个月的天数列表[假设默认情况下没有闰年]
    var ListofDays=[31,28,31,30,31,30,31,31,30,31];
    //如果月份不在1-12之间
    如果(第12个月){
    返回错误('0-无效的月份格式!');
    }
    var isLeap=false;
    //检查闰年
    如果(年份%4==0和年份%100!==0){
    log('year'+year+'是闰年');
    isLeap=true;
    }否则如果(第%4年===0和第%100年===0和第%400年===0){
    log('year'+year+'是闰年');
    isLeap=true;
    }否则{
    console.log('年份'+year+'不是闰年');
    }
    //月份中存在检查日
    var testDay=ListofDays[month-1];//数组从0开始
    //testDay+=isLeap?1:0;//使用三元运算符向testDay添加一个
    if(isLeap)testDay++;//代码更少,执行与上面相同的操作
    如果(天>测试日){
    返回错误('1-无效的日期格式!');
    }
    log('1-有效日期格式!');
    //如果需要,可以在此处返回true
    }
    输入日期并检查其格式是否正确,以及是否为有效日期




    检查日期
    帮你自己一个忙。这为你做了很多艰苦的工作。@Liam这会教给他什么。对于这样一个简单的任务来说也是非常浪费的。在“-”上拆分日期字符串要简单得多,从各个部分创建一个新的日期对象(记住从0开始月份):
    var testDate=new Date(年,月-1,天,0,0)
    并测试这些部分是否与日期部分相同。此外,我没有看到您使用regex抱歉,我是JS新手,我以为它使用的是regex?如何让它使用regex?这又有什么作用?(day>ListofDays[月-1])只是不能解决这个问题谢谢,但我不需要JS来确定日期。我真的希望它能按照我自己学习的方式工作,然后稍后尝试改进。谢谢你,但是为什么我的代码不起作用?这就是我想尝试的,真的要解决这个问题谢谢你,我在路上,所以无法测试,稍后会测试…顺便说一下我如何修改正则表达式,使其不允许在文本框中插入字母?谢谢,如果您想继续,请不要返回-啊,我看到testday+=isLeap?1:0//这怎么可以简化,因为我不理解这一点,也不编写类似这样的IF语句,我真的不介意它是一个长版本,这是供我学习的
    testDay+=
    testDay=testDay+…
    的缩写,
    isLeap?1:0
    称为三元,是
    if(isLeap)testDay=testDay+1;else testDay=testDay+0;也可以编写
    if(isLeap)testDay++;
    return将离开函数。您可以像这样使用返回值:
    if(isValidDate())this.form.submit();
    var input = document.getElementById("myDate").value;
    var parts = input.split("-");
    var date = new Date(parts[2],parts[1]-1,parts[0]);
    return date.getFullYear() == parts[2]
        && date.getMonth() == parts[1]-1
        && date.getDate() == parts[0];