Javascript日期验证(DD / MM / YYYY)&年龄检查

时间:2013-11-06 18:48:09

标签: javascript html validation

我最近开始使用Javascript。我正在测试的是以有效格式检查DoB。下一步将检查年龄。

我的HTML代码包含在

之下
<form name="ProcessInfo" action="#" method="POST" enctype="multipart/form-data" target="_self" onsubmit="return checkForm();">
.
.
.
.
<br>
<label for="txtDOB">Date of Birth:* </label>
<input id="txtDOB" type="text" name="txtDOB" size="12">
format: ##/##/####
<br>
.
.
.
</form>
.
.

我在.js文件中执行了以下操作

var errMessage = "";

function checkForm() {
    validateName();
    validateSurname();
    carSelect();
    validateDOB();

    if (errMessage == "") {
    } else {
        alert(errMessage);
    }
}

...

function validateDOB()
{
    var dob = document.forms["ProcessInfo"]["txtDOB"].value;
    var pattern = /^([0-9]{2})-([0-9]{2})-([0-9]{4})$/;
    if (dob == null || dob == "" || !pattern.test(dob)) {
        errMessage += "Invalid date of birth\n";
        return false;
    }
    else {
        return true
    }
}

我尝试检查它是否对正则表达式有效,但即使我正确输入日期,我总是会收到提醒。如何分离DD / MM / YYYY来计算年龄?

15 个答案:

答案 0 :(得分:21)

如果要在格式中使用正斜杠,则需要使用正则表达式中的反斜杠进行转义:

var pattern =/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/;

http://jsfiddle.net/P9TER/

答案 1 :(得分:13)

我建议使用moment.js,它提供了一种易于使用的方法。

interactive demo

function validate(date){
    var eighteenYearsAgo = moment().subtract(18, "years");
    var birthday = moment(date);

    if (!birthday.isValid()) {
        return "invalid date";    
    }
    else if (eighteenYearsAgo.isAfter(birthday)) {
        return "okay, you're good";    
    }
    else {
        return "sorry, no";    
    }
}

要在页面中包含片刻,您可以使用CDNJS:

<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.4.0/moment.min.js"></script>

答案 2 :(得分:7)

我会利用内置的Date对象为我做验证。即使您从-切换到/,您仍然需要检查月份是否在0到12之间,例如,日期介于0到31之间,以及1900到2013之间的年份。

function validateDOB(){

    var dob = document.forms["ProcessInfo"]["txtDOB"].value;
    var data = dob.split("/");
    // using ISO 8601 Date String
    if (isNaN(Date.parse(data[2] + "-" + data[1] + "-" + data[0]))) {
        return false;
    }

    return true;
}

有关详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse#Example:_Using_parse

答案 3 :(得分:5)

如果要在格式中使用正斜杠,则需要使用正则表达式中的反斜杠进行转义:

&#13;
&#13;
   
var dateformat = /^(0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])[\/\-]\d{4}$/;
&#13;
&#13;
&#13;

答案 4 :(得分:1)

您已使用此格式的正则表达式: DD - MM- YYYY

如果您需要此格式DD / MM / YYYY使用

var pattern =/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/;

答案 5 :(得分:1)

这是两个问题 - 是斜杠正确的地方,是一个有效的日期。 我建议你抓住输入变化并在自己中添加斜杠。 (为用户烦恼)

有趣的问题是他们是否提出了有效的日期,我建议利用js的灵活性:

&#13;
&#13;
function isValidDate(str) {
  var newdate = new Date();
  var yyyy = 2000 + Number(str.substr(4, 2));
  var mm = Number(str.substr(2, 2)) - 1;
  var dd = Number(str.substr(0, 2));
  newdate.setFullYear(yyyy);
  newdate.setMonth(mm);
  newdate.setDate(dd);
  return dd == newdate.getDate() && mm == newdate.getMonth() && yyyy == newdate.getFullYear();
}
console.log(isValidDate('jk'));//false
console.log(isValidDate('290215'));//false
console.log(isValidDate('290216'));//true
console.log(isValidDate('292216'));//false
&#13;
&#13;
&#13;

答案 6 :(得分:1)

使用模式并检查验证:

var input = '33/15/2000';

var pattern = /^((0[1-9]|[12][0-9]|3[01])(\/)(0[13578]|1[02]))|((0[1-9]|[12][0-9])(\/)(02))|((0[1-9]|[12][0-9]|3[0])(\/)(0[469]|11))(\/)\d{4}$/;

alert(pattern.test(input));

答案 7 :(得分:0)

要获取值,请使用pattern.exec()而不是pattern.test()(。test()返回一个布尔值)。

答案 8 :(得分:0)

         if(!/^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{2}$/.test($(this).val())){
                     alert('Date format incorrect (DD/MM/YY)');
                     $(this).datepicker('setDate', "");
                     return false;
                }

此代码将验证日期格式DD / MM / YY

答案 9 :(得分:0)

日期和月份的前导零

var pattern =/^(0[1-9]|1[0-9]|2[0-9]|3[0-1])\/(0[1-9]|1[0-2])\/([0-9]{4})$/;

并且前导零和/无前导零日

var pattern =/^(0?[1-9]|1[0-9]|2[0-9]|3[0-1])\/(0?[1-9]|1[0-2])\/([0-9]{4})$/;

答案 10 :(得分:0)

我使用我找到的代码@。w3resources

代码负责

  • 月份不到12岁,
  • 天不到32
  • 甚至适用于闰年。 在我的项目中使用闰年我修改代码如

    if((lyear == false)&amp;&amp;(dd&gt; = 29))
    {
    alert('日期格式无效!');
    返回false;
    }

    if((lyear == false)&amp;&amp;(dd&gt; = 29))
    {
    警报('不是闰年2月不能超过28天'); 返回false;
    }

而不是抛出通用的“无效日期格式”错误,这对用户没有多大意义。 我修改了剩下的代码,提供有效的错误信息,比如月份不能超过12天,天数也不能超过31等。

使用正则表达式的问题是难以准确识别出错的地方。它要么给出真或假 - 没有任何理由为什么它失败了。我们必须编写多个正则表达式来解决这个问题。

答案 11 :(得分:0)

echo $HOME/.ansible/tmp/ansible-tmp-1474479086.86-239783828445202

答案 12 :(得分:0)

你可以使用html标签的属性而不是html输入类型=&#34; date&#34;可以用来代替验证它。这就是html 5给你带来的好处

答案 13 :(得分:0)

如果您正在使用moment,那就是单行代码:

moment(date).format("DD/MM/YYYY").isValid()

答案 14 :(得分:0)

当我们只放置模式时,检查每种可能的日期组合并不简单。用户可以输入有效的数字,例如99/99/9999,但这不是一个有效的日期。即使我们将天和月份的值限制在一个更严格的值(30/31天和0-12个月),我们仍然可能遇到leap年,febraury等问题,我们无法使用正则表达式正确验证它们。因此,更好的方法是使用日期对象本身。

let InputDate = "99/99/9999"
let pattern =/^([0-9]{2})\/([0-9]{2})\/([0-9]{4})$/;
let editDate = InputDate.replace("\/","-")

let dateValidation = function validation(){
  
if(pattern.test(InputDate) && new Date(editDate) == 'Invalid Date'){
  return false;
}else{
  return true;
}

}

console.log(dateValidation()) //Return false