2013-03-04 302 views
19

我想驗證日期時間格式MM/DD/YYYY。這是我正在嘗試的代碼請幫助。正則表達式驗證日期時間格式(MM/DD/YYYY)

function ValidateDate(testdate) { 
     var Status 
     var reg = /^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g; 
     if (!reg.test(testdate)) { 
      Status = false; 
     } 
     return Status; 
    } 
+1

請參閱http://www.devnetwork.net/viewtopic.php?f = 29&t = 13795 – Deadlock 2013-03-04 07:24:12

+1

你的代碼究竟有什麼問題? – nhahtdh 2013-03-04 07:28:58

+0

正則表達式有些問題 – Supreet 2013-03-04 07:50:39

回答

43

試試你的正則表達式與像http://jsregex.com/工具(有很多),或者更好的,一個單元測試。

對於天真的驗證:

function validateDate(testdate) { 
    var date_regex = /^\d{2}\/\d{2}\/\d{4}$/ ; 
    return date_regex.test(testdate); 
} 

你的情況,以驗證(MM/DD/YYYY),與1900和2099之間的一年,我會寫這樣的:

function validateDate(testdate) { 
    var date_regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/ ; 
    return date_regex.test(testdate); 
} 
+0

非常感謝。它的工作適合我。 – Supreet 2013-03-04 07:40:28

+0

我編輯添加一個更復雜的驗證。 – noirbizarre 2013-03-04 07:43:48

+0

@Supreet:這只是微弱的驗證。您仍然需要在服務器端進行徹底的驗證。 – nhahtdh 2013-03-04 07:57:01

0
var pattern = new RegExp((0|1)[0-9]\/[0-3][0-9]\/(19|20)[0-9]{2}); 
if(!testdate.match(pattern)) 
    return false; 
else return true; 
+2

在我看來,使用'(0 [0-9] | 1 [012])'更適合檢查'MM'。 – hjpotter92 2013-03-04 07:27:12

+0

這會給出語法錯誤。即使你修復它,正則表達式也比OP更糟糕。 – nhahtdh 2013-03-04 07:27:17

+0

@Dream Eater你是對的 – MIIB 2013-03-04 07:28:36

0

於Web開發,您可以使用NG模式:

<input type="text" ng-pattern="/^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/" style="width:100px" id="dateofbirth" name="dob" placeholder="mm/dd/yyyy" ng-model="user.dob" required /> 
0

你可以看看到this鏈接,我希望這可能是很大的幫助,因爲它是我的。

如果您使用的是Java代碼上面的鏈接中給出的正則表達式,然後使用下面的正則表達式

"^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\\d\\d$"

正如我在你的例子注意到,您正在使用js函數那麼這種使用正則表達式

"^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$"

這將從1900-01-01和2099年12月31日之間匹配毫米/ dd/yyyy格式的日期,與四個分離器選擇。 ,不要忘記

return regex.test(testdate);

2

在此基礎上

dd-mm-yy

我修改了原來這樣:

^(?:(?:(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec))(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:(?:0?2|(?:Feb))(\/|-|\.)(?:29)\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$ 

test the regex here

5

ŧ他的答案是完美的,但對於一種情況,dd和mm實際上是單個數字。下面的正則表達式是完美的在這種情況下:

function validateDate(testdate) { 
 
     var date_regex = /^(0?[1-9]|1[0-2])\/(0?[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/ ; 
 
     return date_regex.test(testdate); 
 
    }

-3

它的長,但偉大的:

new RegExp(/(?=\d)^(?:(?!(?:10\D(?:0?[5-9]|1[0-4])\D(?:1582))|(?:0?9\D(?:0?[3-9]|1[0-3])\D(?:1752)))((?:0?[13578]|1[02])|(?:0?[469]|11)(?!\/31)(?!-31)(?!\.31)|(?:0?2(?=.?(?:(?:29.(?!000[04]|(?:(?:1[^0-6]|[2468][^048]|[3579][^26])00))(?:(?:(?:\d\d)(?:[02468][048]|[13579][26])(?!\x20BC))|(?:00(?:42|3[0369]|2[147]|1[258]|09)\x20BC))))))|(?:0?2(?=.(?:(?:\d\D)|(?:[01]\d)|(?:2[0-8])))))([-.\/])(0?[1-9]|[12]\d|3[01])\2(?!0000)((?=(?:00(?:4[0-5]|[0-3]?\d)\x20BC)|(?:\d{4}(?!\x20BC)))\d{4}(?:\x20BC)?)(?:$|(?=\x20\d)\x20))?((?:(?:0?[1-9]|1[012])(?::[0-5]\d){0,2}(?:\x20[aApP][mM]))|(?:[01]\d|2[0-3])(?::[0-5]\d){1,2})?$/); 
+0

雖然代碼經常爲自己說話,但只包含代碼並且沒有文本解釋的答案會被標記爲複審隊列。您可以通過添加一個或兩個解釋來避免這種情況。 – Will 2016-07-07 03:32:28

+0

沒有說明它包含哪些功能,並讓人迷惑。 – 2016-09-26 22:53:01

0

在這種情況下,以驗證日期(DD-MM- YYYY)或(DD/MM/YYYY),年份在1900年至2099年之間,如此月份和日期驗證

if (!Regex.Match(txtDob.Text, @"^(0[1-9]|1[0-9]|2[0-9]|3[0,1])([/+-])(0[1-9]|1[0-2])([/+-])(19|20)[0-9]{2}$").Success)     
{ 
    MessageBox.Show("InValid Date of Birth"); 
    txtDob.Focus(); 
}