如何检查字符串是否是合法的“dd / mm / yyyy”日期?

时间:2011-09-28 11:53:50

标签: javascript jquery string date date-format

给定字符串str,如何检查它是否为dd/mm/yyyy格式且包含合法日期?

一些例子:

bla bla      // false
14/09/2011   //         true
09/14/2011   // false
14/9/2011    // false
1/09/2011    // false
14/09/11     // false
14.09.2011   // false
14/00/2011   // false
29/02/2011   // false
14/09/9999   //         true

7 个答案:

答案 0 :(得分:13)

编辑:

下面的确切解决方案

您可以执行类似的操作,但使用更准确的日期验证算法:

function testDate(str) {
  var t = str.match(/^(\d{2})\/(\d{2})\/(\d{4})$/);
  if(t === null)
    return false;
  var d = +t[1], m = +t[2], y = +t[3];

  // Below should be a more acurate algorithm
  if(m >= 1 && m <= 12 && d >= 1 && d <= 31) {
    return true;  
  }

  return false;
}

http://jsfiddle.net/aMWtj/

日期验证alg。:http://www.eee.hiflyers.co.uk/ProgPrac/DateValidation-algorithm.pdf

确切的解决方案:函数返回解析的日期或null,完全取决于您的要求。

function parseDate(str) {
  var t = str.match(/^(\d{2})\/(\d{2})\/(\d{4})$/);
  if(t !== null){
    var d = +t[1], m = +t[2], y = +t[3];
    var date = new Date(y, m - 1, d);
    if(date.getFullYear() === y && date.getMonth() === m - 1) {
      return date;   
    }
  }

  return null;
}

http://jsfiddle.net/aMWtj/2/

如果您需要函数返回true / false和yyyy / mm / dd格式

function IsValidDate(pText) {
    var isValid = false ;
    var t = pText.match(/^(\d{4})\/(\d{2})\/(\d{2})$/);

    if (t !== null) {
        var y = +t[1], m = +t[2], d = +t[3];
        var date = new Date(y, m - 1, d);

        isValid = (date.getFullYear() === y && date.getMonth() === m - 1) ;
    }

    return isValid ;
}

答案 1 :(得分:6)

尝试 -

   var strDate = '12/03/2011';
   var dateParts = strDate.split("/");
   var date = new Date(dateParts[2], (dateParts[1] - 1) ,dateParts[0]);

此问题中有更多信息 - Parse DateTime string in JavaScript(我的答案中的代码受链接问题的影响很大)

演示 - http://jsfiddle.net/xW2p8/

修改

更新了答案,试试 -

function isValidDate(strDate) {
    if (strDate.length != 10) return false;
    var dateParts = strDate.split("/");
    var date = new Date(dateParts[2], (dateParts[1] - 1), dateParts[0]);
    if (date.getDate() == dateParts[0] && date.getMonth() == (dateParts[1] - 1) && date.getFullYear() == dateParts[2]) {
        return true;
    }
    else return false;
}

此函数传递所有测试用例。据我所知,在我纠正原来的错误答案之前,Adam Jurczyk已经发布了一个准确的答案。他值得称赞。

演示 - http://jsfiddle.net/2r6eX/1/

答案 2 :(得分:0)

您可以使用常规exp来验证日期。 试试这样:

  re = /^\d{1,2}\/\d{1,2}\/\d{4}$/; 
if(form.mydate.value != '' && !form.mydate.value.match(re))
  //do something here

注意:这只适用于dd / mm / yyyy

与您的要求使用完全匹配

 re = /^\d{2}\/\d{2}\/\d{4}$/; 

答案 3 :(得分:0)

我将回答一个不同的问题,因为Misha Moroshko已经得到了很好的回答:使用HTML5。也就是说,假设所讨论的字符串是通过Web浏览器作为用户输入产生的,我建议将这些条目作为

接收
   <input type = "date" ...

我认识到并非所有可能使用的浏览器都会以严格执行有效性的方式解释“日期”。然而,这是正确的做法,随着时间的推移肯定会有所改善,并且在特定的上下文中可能已经足够好,即使现在只是为了消除在事后验证日期字符串的需要。

答案 4 :(得分:0)

就个人而言,我认为最好的解决方案是修改UI以使用月份和可能的日期选择的下拉列表。

试图根据输入字符串判断1/2/2001是1月2日还是2月1日是不可能的。

答案 5 :(得分:0)

最近的发现:您可以使用date.js lib,它会添加Date.parseExact函数,因此您可以Date.parseExact(dateString,"dd/MM/yyyy")。当月份为00时,它会失败,但它仍然有用。

答案 6 :(得分:0)

  

仅适用于dd / mm / yyyy格式

^(0?[1-9]|[12][0-9]|3[01])[\/](0?[1-9]|1[012])[\/]\d{4}$