用于验证日期时间格式(MM/DD/YYYY)的正则表达式

36
我正在尝试验证日期时间格式 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
你的代码出了什么问题? - nhahtdh
正则表达式出了点问题。 - Supreet
3
尝试使用正则表达式来验证日期是快速变得疯狂的好方法 - 将其结构化以接受每个月的所有日期,但不接受每个月的无效日期会导致组合爆炸。这样想吧... 你想拒绝任何一个月的32号,几个月的31日,包括每年的06/31,你必须接受每年的02/28但大多数年份要拒绝02/29,然而如果年份可被4整除但不能被100整除,则应接受02/29,但如果年份可被400整除,则02/29就可以接受。 - Bevan
7个回答

91

尝试使用类似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);
}

@Supreet:这只是弱验证。你仍然需要在服务器端进行彻底的验证。 - nhahtdh
@nhahtdh:我该如何进行服务器端检查以验证格式? - Supreet
1
它不会使02/30/2016日期无效。 - Jitendra Pancholi
1
你的简单正则表达式模式恰好符合我想要的。谢谢。 - BrianLegg
1
@noirbizarre这对于validateDate("02/31/1999")无效。它会返回true。你可以请修正一下吗? - Rahul
显示剩余5条评论

14

被标记的答案非常完美,但在一种情况下,即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

基于此

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


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之间以mm/dd/yyyy格式表示的日期,并提供四种分隔符选择。别忘了

return regex.test(testdate);


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
这将会产生语法错误。即使你修复了它,正则表达式也比 OP 的更糟糕。 - nhahtdh
@Dream Eater 你说得对。 - MIIB
这个正则表达式允许日期和月份为“00”,这是无效的。 - tftd

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

-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})?$/);

虽然代码通常可以自我解释,但是仅包含代码而没有文字说明的答案会被标记为需要审核。您可以通过添加一两句说明来避免这种情况。 - Will
没有解释它包含的功能,让人感到困惑。 - Tony Dong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接