如何使用jquery以此格式验证日期(yyyy-mm-dd)?

时间:2013-09-12 08:05:33

标签: javascript jquery

我试图以这种格式验证日期:(yyyy-mm-dd)。我找到了这个解决方案,但它的格式与我需要的格式不同,如:(mm / dd / yyyy)。

以下是该解决方案的链接:http://jsfiddle.net/ravi1989/EywSP/848/

我的代码如下:

function isDate(txtDate)
{
    var currVal = txtDate;
    if(currVal == '')
        return false;

    var rxDatePattern = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/; //Declare Regex
    var dtArray = currVal.match(rxDatePattern); // is format OK?

    if (dtArray == null) 
        return false;

    //Checks for mm/dd/yyyy format.
    dtMonth = dtArray[1];
    dtDay= dtArray[3];
    dtYear = dtArray[5];        

    if (dtMonth < 1 || dtMonth > 12) 
        return false;
    else if (dtDay < 1 || dtDay> 31) 
        return false;
    else if ((dtMonth==4 || dtMonth==6 || dtMonth==9 || dtMonth==11) && dtDay ==31) 
        return false;
    else if (dtMonth == 2) 
    {
        var isleap = (dtYear % 4 == 0 && (dtYear % 100 != 0 || dtYear % 400 == 0));
        if (dtDay> 29 || (dtDay ==29 && !isleap)) 
                return false;
    }
    return true;
}

我可以使用哪种正则表达式模式来解释无效日期和闰年?

11 个答案:

答案 0 :(得分:48)

我稍微扩展了上面发布的isValidDate函数Thorbin(使用正则表达式)。我们使用正则表达式来检查格式(以防止我们获得另一种对Date有效的格式)。在这个松散检查之后,我们实际上通过Date构造函数运行它,如果在这种格式下有效,则返回true或false。如果它不是有效日期,我们将从此函数中获取错误。

function isValidDate(dateString) {
  var regEx = /^\d{4}-\d{2}-\d{2}$/;
  if(!dateString.match(regEx)) return false;  // Invalid format
  var d = new Date(dateString);
  var dNum = d.getTime();
  if(!dNum && dNum !== 0) return false; // NaN value, Invalid date
  return d.toISOString().slice(0,10) === dateString;
}


/* Example Uses */
console.log(isValidDate("0000-00-00"));  // false
console.log(isValidDate("2015-01-40"));  // false
console.log(isValidDate("2016-11-25"));  // true
console.log(isValidDate("1970-01-01"));  // true = epoch
console.log(isValidDate("2016-02-29"));  // true = leap day
console.log(isValidDate("2013-02-29"));  // false = not leap day

答案 1 :(得分:18)

如果这对你来说足够了,你也可以使用正则表达式完成一个稍微简单的工作(例如[1]中所见)。

它们内置于javascript中,因此您可以在没有任何库的情况下使用它们。

function isValidDate(dateString) {
  var regEx = /^\d{4}-\d{2}-\d{2}$/;
  return dateString.match(regEx) != null;
}

将检查给定字符串是否为四个数字 - 两个数字 - 两个数字(几乎为yyyy-mm-dd)。但是你可以用更复杂的表达式做更多的事情,例如检查[2]。

isValidDate("23-03-2012") // false
isValidDate("1987-12-24") // true
isValidDate("22-03-1981") // false
isValidDate("0000-00-00") // true

答案 2 :(得分:10)

由于标记了jQuery,因此这是一种简单/用户友好的方式来验证必须是日期的字段(您需要jQuery validation plugin):

HTML

<form id="frm">
<input id="date_creation" name="date_creation" type="text" />
</form>

的jQuery

$('#frm').validate({
  rules: {
    date_creation: {
      required: true,
      date: true
    }
  }
});

DEMO + Example


更新:经过一番挖掘后,我发现没有可用于设置特定日期格式的准备参数的证据。

但是,您可以在自定义规则中插入所选的正则表达式:)

$.validator.addMethod(
    "myDateFormat",
    function(value, element) {
        // yyyy-mm-dd
        var re = /^\d{4}-\d{1,2}-\d{1,2}$/;

        // valid if optional and empty OR if it passes the regex test
        return (this.optional(element) && value=="") || re.test(value);
    }
);

$('#frm').validate({
  rules: {
    date_creation: {
      // not optional
      required: true,
      // valid date
      date: true
    }
  }
});

此新规则意味着您的标记更新:

<input id="date_creation" name="date_creation" type="text" class="myDateFormat" />

答案 3 :(得分:5)

试试这个Here is working Demo

$(function() {
    $('#btnSubmit').bind('click', function(){
        var txtVal =  $('#txtDate').val();
        if(isDate(txtVal))
            alert('Valid Date');
        else
            alert('Invalid Date');
    });

function isDate(txtDate)
{
    var currVal = txtDate;
    if(currVal == '')
        return false;

    var rxDatePattern = /^(\d{4})(\/|-)(\d{1,2})(\/|-)(\d{1,2})$/; //Declare Regex
    var dtArray = currVal.match(rxDatePattern); // is format OK?

    if (dtArray == null) 
        return false;

    //Checks for mm/dd/yyyy format.
    dtMonth = dtArray[3];
    dtDay= dtArray[5];
    dtYear = dtArray[1];        

    if (dtMonth < 1 || dtMonth > 12) 
        return false;
    else if (dtDay < 1 || dtDay> 31) 
        return false;
    else if ((dtMonth==4 || dtMonth==6 || dtMonth==9 || dtMonth==11) && dtDay ==31) 
        return false;
    else if (dtMonth == 2) 
    {
        var isleap = (dtYear % 4 == 0 && (dtYear % 100 != 0 || dtYear % 400 == 0));
        if (dtDay> 29 || (dtDay ==29 && !isleap)) 
                return false;
    }
    return true;
}

});

改变了正则表达式:

var rxDatePattern = /^(\d{4})(\/|-)(\d{1,2})(\/|-)(\d{1,2})$/; //Declare Regex

答案 4 :(得分:3)

我建议使用 使用jquery验证插件和jquery ui日期选择器

jQuery.validator.addMethod("customDateValidator", function(value, element) {
// dd-mm-yyyy
   var re = /^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$/ ; 
   if (! re.test(value) ) return false
   // parseDate throws exception if the value is invalid
   try{jQuery.datepicker.parseDate( 'dd-mm-yy', value);return true ;}
   catch(e){return false;} 
   },
   "Please enter a valid date format dd-mm-yyyy"
);

this.ui.form.validate({
    debug: true,
    rules : {
    title : { required : true, minlength: 4 }, 
    date : { required: true, customDateValidator: true }
    }
}) ;

使用Jquery和日期选择器只需使用

创建一个函数
// dd-mm-yyyy
var re = /^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$/ ; 
 if (! re.test(value) ) return false
// parseDate throws exception if the value is invalid
try{jQuery.datepicker.parseDate( 'dd-mm-yy', value);return true ;}
catch(e){return false;}

您可能只使用正则表达式进行验证

// dd-mm-yyyy
var re = /^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$/ ; 
return re.test(value) 

当然,日期格式应属于您所在的地区

答案 5 :(得分:2)

这是YYYY-MM-DD格式的JavaScript代码

/([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))/

答案 6 :(得分:2)

 moment(dateString, 'YYYY-MM-DD', true).isValid() ||
 moment(dateString, 'YYYY-M-DD', true).isValid() ||
 moment(dateString, 'YYYY-MM-D', true).isValid();

答案 7 :(得分:1)

将正则表达式重新排列为:

/^(\d{4})([\/-])(\d{1,2})\2(\d{1,2})$/

我做的不仅仅是重新安排条款,我还做了它,以便它不接受像yyyy-mm/dd这样的“破损”日期。

之后,您需要调整dtMonth等变量,如下所示:

dtYear = dtArray[1];
dtMonth = dtArray[3];
dtDay = dtArray[4];

之后,代码应该可以正常工作。

答案 8 :(得分:0)

工作演示小提琴 Demo

将验证功能更改为此

function isDate(txtDate)
{
return txtDate.match(/^d\d?\/\d\d?\/\d\d\d\d$/);
}

答案 9 :(得分:0)

只需使用Date构造函数与字符串输入进行比较:

function isDate(str) {
  return 'string' === typeof str && (dt = new Date(str)) && !isNaN(dt) && str === dt.toISOString().substr(0, 10);
}

console.log(isDate("2018-08-09"));
console.log(isDate("2008-23-03"));
console.log(isDate("0000-00-00"));
console.log(isDate("2002-02-29"));
console.log(isDate("2004-02-29"));

已编辑:回复其中一项评论

  

嗨,它在IE8上不起作用,您是否有针对– Mehdi Jalal的解决方案

function pad(n) {
  return (10 > n ? ('0' + n) : (n));
}

function isDate(str) {
  if ('string' !== typeof str || !/\d{4}\-\d{2}\-\d{2}/.test(str)) {
    return false;
  }
  var dt = new Date(str.replace(/\-/g, '/'));
  return dt && !isNaN(dt) && 0 === str.localeCompare([dt.getFullYear(), pad(1 + dt.getMonth()), pad(dt.getDate())].join('-'));
}

console.log(isDate("2018-08-09"));
console.log(isDate("2008-23-03"));
console.log(isDate("0000-00-00"));
console.log(isDate("2002-02-29"));
console.log(isDate("2004-02-29"));

答案 10 :(得分:-1)

你可以将它用于YYYY-MM-DD。它检查它是否是有效日期并且该值不是NULL。如果检查结果是正确的,则返回TRUE;如果任何内容无效,则返回FALSE。它没有比这更容易了!

function validateDate(date) {
    var matches = /^(\d{4})[-\/](\d{2})[-\/](\d{2})$/.exec(date);
    if (matches == null) return false;
    var d = matches[3];
    var m = matches[2] - 1;
    var y = matches[1] ;
    var composedDate = new Date(y, m, d);
    return composedDate.getDate() == d &&
            composedDate.getMonth() == m &&
            composedDate.getFullYear() == y;
}

请注意,需要按月删除几个月:var m = matches[2] - 1;否则new Date()实例无法正常制作。