2011-11-10 82 views
0

我发现测试格式和日期字段的内容的一种非常有用的正则表达式的正则表达式示例站点正则表达式进行测试的日期格式

,但我得到验证,当我把在日期比2000年长而且由于这是一个输入出生日期的字段,你可以看到它为什么会是一个问题。我相信这是一个简单的解决方法,但正则表达式会吓倒我。

$('#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); 
} 

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

+4

正则表达式是不是首选工具日期验证(见[这里](http://stackoverflow.com/questions/4290433/regular-expression-for-aspregularexpressionvalidator-with-format-mmddyy-leap-y/4291747#4291747)为什么不)。他们可以检查“可能是日期的东西”,但如果你需要考虑日期范围,月份长度,闰年等,你最好用[日期分析器](http://代码。 google.com/p/datejs/wiki/APIDocumentation#parseExact)。 –

+0

这不是一个特别好的正则表达式,但我可以找到你(特别是众多的'{1}'是没有意义的) –

+0

为什么你不会创建一个JavaScript日期对象并使用它的本地函数? –

回答

6

不检测的,如果一个字符串匹配,你觉得会是个不错的日期一种或多种格式,我建议而不是要求的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 method to ensure that a date is valid

+0

您的建议使用其他JavaScript方法正是我所需要的。 –

+0

'新日期(“黑客%1337”)'返回字符串'星期二01 01 1337 00:00:00 GMT-0600(中部标准时间)' – Motes

2

这里有很多烂摊子。首先,消除所有的{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但正如蒂姆上面说的,如果你想真正有效的日期,你应该使用一个特定的日期验证。

1

如果你需要的日期字符串解析成日期,然后我会看看这个库: