用于测试日期格式的正则表达式

我发现了一个非常有用的正则表达式,用于测试正则表达式示例站点中日期字段的格式和内容

但是当我输入2000年以前的日期时我得到了validation,因为这是一个输入出生日期的字段,你可以看出它为什么会出问题。 我确信这是一个简单的解决方案,但正则表达式恐吓我。

$('#txtDOB').blur(function() { //$('span.error-keyup-5').remove(); var inputVal = $(this).val(); var dateReg = /^[0,1]?\d{1}\/(([0-2]?\d{1})|([3][0,1]{1}))\/(([1]{1}[9]{1}[9]{1}\d{1})|([2-9]{1}\d{3}))$/; if(!dateReg.test(inputVal)) { alert('invalid date format: ' + inputVal); } 

我没有和这个解决方案结婚,所以如果你能建议一个更好的方法,请评论。

而不是测试一个字符串是否匹配您认为可能是好日期的一种或多种格式,我建议改为询问JavaScript是否认为它是有效日期:

 function isValidDate(str){ return !isNaN(new Date(str)); } 

这假设您将接受用户以各种格式提供的内容(例如,可怕的美国MM / DD / YYYY或更健全的ISO8601 YYYY-MM-DD) 。 如果你有一个特定的格式,你只会接受,然后根据它解析你的字符串,拉出年/月/日,然后问JavaScript这是否是一个有效的日期:

 function isValidDate(year, month, date) { var d = new Date(year*=1, month-=1, date*=1, 12); // noon to skip DST issues return d.getFullYear()==year && d.getMonth()==month; // wrong date->wrong month } 

您需要检查年/月/日全部是否匹配,因为new Date(2011,11,32)被接受并被解释为2012-1-1。

另请参阅: 确保日期有效的Javascript方法

那里有很多混乱。 首先,消除所有{1}。 这只是一个实例,它完全是多余的。 此外,具有一个值的字符类与字符本身相同。 所以,[1]变为1。

所以,这让我们:

  /^[01]?\d\/(([0-2]?\d)|([3][01]))\/((199\d)|([2-9]\d{3}))$/ 

大概是MM / DD / YYYY。 但YYYY只有199 [0-9],任何一年> 2000和<9999.哇,这是一个日期范围!

作为基础,尝试:

  /^[01]?\d\/(([0-2]?\d)|([3][01]))\/([12]\d{3}))$/ 

这给出了1000 – 2999的年份范围。但正如蒂姆所说,如果你想要真正有效的日期,你应该使用特定的日期validation器。

如果你需要将日期字符串解析为日期,那么我会检查这个库:

  • DateJS