41

我正在尝试以这种格式验证日期:(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;
}

我可以为此使用什么正则表达式模式来解释无效日期和闰年?

4

11 回答 11

107

我稍微扩展了上面发布的 isValidDate 函数 Thorbin(使用正则表达式)。我们使用正则表达式来检查格式(以防止我们获得对日期有效的另一种格式)。在这个松散的检查之后,我们实际上通过 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

于 2016-02-15T16:10:27.717 回答
29

如果这对您来说足够了,您也可以只使用正则表达式来完成一个稍微简单的工作(例如,如 [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
于 2013-09-12T08:18:38.933 回答
10

由于 jQuery 被标记,这是一种简单/用户友好的方法来验证必须是日期的字段(您将需要jQuery 验证插件):

html

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

jQuery

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

演示 + 示例


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

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

$.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" />
于 2013-09-12T08:15:58.203 回答
5

试试这个这里是工作演示

$(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
于 2013-09-12T08:12:06.973 回答
5

这是 YYYY-MM-DD 格式的 JavaScript 拒绝

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

于 2018-10-31T13:11:48.760 回答
4

我建议使用使用 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) 

当然日期格式应该是您所在地区的

于 2014-02-16T20:42:59.347 回答
3
 moment(dateString, 'YYYY-MM-DD', true).isValid() ||
 moment(dateString, 'YYYY-M-DD', true).isValid() ||
 moment(dateString, 'YYYY-MM-D', true).isValid();
于 2020-05-13T07:23:21.867 回答
2

只需使用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"));

于 2018-08-09T05:42:59.750 回答
1

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

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

我所做的不仅仅是重新排列条款,我还做了它,这样它就不会接受像yyyy-mm/dd.

之后,您需要dtMonth像这样调整等变量:

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

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

于 2013-09-12T08:11:58.557 回答
0

Working Demo fiddle here Demo

将您的验证功能更改为此

function isDate(txtDate)
{
return txtDate.match(/^d\d?\/\d\d?\/\d\d\d\d$/);
}
于 2013-09-12T08:16:19.237 回答
-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()将无法正确创建实例。

于 2016-02-15T15:53:58.420 回答