2011-11-10 83 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

如果你需要的日期字符串解析成日期,然後我會看看這個庫: