Javascript日期格式验证:dd/mm/yyyy?

7

我有一个HTML表单字段,人们可以输入编码为以下格式的日期:

input type="text" name="dateofbirth" placeholder="dd/mm/yyyy"

我正在寻找一个JavaScript代码,以检查日期是否按照“dd/mm/yyyy”格式输入(10个字符,2/2/4)。
如有任何建议,请提出。这是我第一次尝试编写JavaScript,直到遇到这个问题都顺利进行。
编辑:代码(表单名称为“signup”)。
// JavaScript Document
function validateForm(signup) {
  {
    var x = document.forms["signup"]["dateofbirth"].value;
    var reg = /(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d/;
    if (x.match(reg)) {
      return true;
    }
    else {
      alert("Please enter dd/mm/yyyy");
      return false;
    }           
  }
}

6
我不是有意冒犯,但我认为仅仅搜寻可用的代码脚本并不算是“编写 JavaScript” :-) 如果你能发布一些你尝试过的代码和相关 HTML,会给其他人提供一个起点。 - Pointy
1
这个问题有很多种可能的方法 - 具体说明会更有帮助!(有多少个可能的日期字段?在提交时还是在用户输入文本时进行验证?当输入无效时的行为是什么?) - Snuffleupagus
@Pointy:嗯,我只是一名学生,教科书没什么用,所以谷歌成了我的第二选择。我几乎尝试了所有不使用任何外部库、数组、php、.ASAP或jQuery等的脚本。我只能使用JavaScript。但什么都不起作用。 - silentauror
1
@silentauror,听起来你知道需要做什么。与其搜索特定的解决方案,为什么不在实现自己的解决方案时搜索你遇到的具体问题呢?例如,“javascript hook onsubmit”,“regex date”等。组装这些部分应该会让你了解它们是如何工作的,并帮助你走上正确的道路;而复制和粘贴已完成的解决方案则不会。 - Snuffleupagus
@silentauror(我可能显得很刻薄,但这并不是我的本意)每当您发布一个问题时,如果您有相关的代码,请一并发布。如果您发布原始的代码片段,我们可以向您解释为什么它无法工作以及您需要做什么来修复它,这样下次您就知道如何处理了。:o) - Snuffleupagus
显示剩余3条评论
6个回答

7
您可以使用正则表达式通过JavaScript验证您提供的日期格式。下面是示例代码。
function(input){
  var reg = /(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d/;
  if (input.match(reg)) {
    alert("Input matched");
  }
  else {
    alert("Please enter dd/mm/yyyy");
  }
}

ES6

const DDMMYYY_Validation = (input) : boolean=>{
  var reg = /(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d/;
  return !!input?.match(reg);
}

我相信这应该是可行的,看起来也没问题,但我使用它仍然不起作用。真让人沮丧。 - silentauror
你正在传递哪种类型的输入。我在 http://gskinner.com/RegExr/ 上测试了正则表达式,它可以适用于你的模式。 - irfanmcsd
1
请注意,虽然这个正则表达式试图确保有效的日期,但它并没有(特别是在闰年方面)。鉴于此,为什么不直接使用 /\d{1,2}/\d{1,2}/\d{4} - Phrogz
我在问题中发布了我尝试过的最新代码...它哪里出错了? - silentauror
还有@Phrogz感谢编辑问题。我一直在努力让它阻止所有代码。 :) - silentauror
语句的 else 部分前面缺少一个 }。 - user2251695

1

你有没有看过Moment.js的JavaScript库?

http://momentjs.com/

我还没有使用过它,但我计划将我的Javascript代码迁移到它上面。


很遗憾不能使用外部库。 - silentauror

1

验证日期包括所有角色,如闰年的2月28日和29日

function leapYear(year) {
    return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}



function validateDayMonth(day, month, year) {
        var months = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"];
        var days = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"];
        if (months.indexOf(month) != -1 && days.indexOf(day) != -1) {
            if ((month == '02' && day == '29' && leapYear(year) == false) || (month == '02' && day == '30') || (month == '02' && day == '31') || (month == '04' && day == '31') || (month == '06' && day == '31') || (month == '09' && day == '31') || (month == '11' && day == '31')) {
                return false;
            } else {
                var GivenDate = year + '-' + month + '-' + day;
                var CurrentDate = new Date();
                GivenDate = new Date(GivenDate);
                if (GivenDate > CurrentDate) {
                    return false;
                } else {
                    return true;
                }
            }
        } else {
            return false;
        }

    }

1

我发现最好的 JavaScript 日期库是 date.js,位于 http://code.google.com/p/datejs/

它还具有文化意识,因此要验证您的 dd/mm/yyyy 日期(我假设您不在美国),请使用以下方式的 Date.parse:

var d1 = Date.parse("01/12/2004"); // returns a valid JavaScript date
var d2 = Date.parse("30/02/2004"); // returns null

嗨,如果我能在这个项目中使用外部库就太好了...但是我不能使用。 - silentauror
这个不起作用。例如,Parse("05/15/1999") 返回现有日期。 - A. Gusev

0
请查看MDN正则表达式指南。您需要了解匹配数字的字符类的信息-搜索“匹配数字字符”短语;以及指定匹配的确切长度的方法-在本指南中搜索“匹配前一个字符的n次出现”短语。

0

你是否查看了网页浏览器的错误控制台,确保没有JS语法或运行时错误?你附加到问题中的JavaScript代码是无效的令人惊讶的(你多余地使用了{} 来包装函数主体)。

提示:当使用正则表达式测试字符串的有效性时,应该使用if (regex.test(str))而不是if (str.match(regex)),以获得简单、高效和自我文档化的结果。

根据您的要求,我会这样做:

function isDDMMYYYY(str){
  return /^\d{2}/\d{2}/\d{4}$/.test(str);
}

然而,我个人会更改要求,允许用户输入一位数字的日期和月份:

return /^\d{1,2}/\d{1,2}/\d{4}$/.test(str);

抱歉,我对JavaScript真的是个新手...我应该在哪里实现这个:return /^\d{2}/\d{2}/\d{4}$/.test(str); - silentauror
@silentauror 如果你不想像我在第一个代码示例中那样将其封装为函数(第二个示例只是我没有重复自己),那么你可以使用var isValidLookingDate = /.../.test(str); - Phrogz
{ var x= document.forms["signup"]["dateofbirth"].value; var isvalid = /^\d{1,2}/\d{1,2}/\d{4}$/.test(x); if (isvalid.match(x)) { return true; } else { alert("请填写dd/mm/yyyy格式的日期"); return false; } }代码出现语法错误,无法正常运行。我已经搞得自己很困惑了,这真是太令人沮丧了。(注:评论中无法输入空格,但代码在空格和缩进方面已经正确格式化) - silentauror

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接