How to check if a string is a legal “dd/mm/yyyy” date?

前端 未结 7 1903
遥遥无期
遥遥无期 2020-12-01 15:05

Given a string str, how could I check if it is in the dd/mm/yyyy format and contains a legal date ?

Some examples:

bla bla          


        
相关标签:
7条回答
  • 2020-12-01 15:32

    I'm going to answer a different question, as Misha Moroshko's has already been well-answered: use HTML5. That is, on the assumption that the strings in question arise as user inputs through a Web browser, I propose that the entries be received as

       <input type = "date" ...
    

    I recognize that not all browsers likely to be in use will interpret "date" in a way that rigorously enforces validity. It's the right thing to do, though, will certainly improve as time goes on, and might well be good enough in a particular context even now simply to eliminate the need to validate the date-string after the fact.

    0 讨论(0)
  • 2020-12-01 15:33

    Edit: exact solution below

    You could do something like this, but with a more accurate algorithm for day validation:

    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/

    Date validation alg.: http://www.eee.hiflyers.co.uk/ProgPrac/DateValidation-algorithm.pdf

    Exact solution: function that returns a parsed date or null, depending exactly on your requirements.

    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/

    In case you need the function to return true/false and for a yyyy/mm/dd format

    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 ;
    }
    
    0 讨论(0)
  • 2020-12-01 15:33

    Personally, I think the best solution would be to modify the UI to use dropdowns for the month and possibly day selections.

    Trying to figure out if 1/2/2001 is January 2nd or February 1st based solely on that input string is impossible.

    0 讨论(0)
  • 2020-12-01 15:36

    for dd/mm/yyyy format only

    ^(0?[1-9]|[12][0-9]|3[01])[\/](0?[1-9]|1[012])[\/]\d{4}$
    
    0 讨论(0)
  • 2020-12-01 15:43

    Recent discovery: You can use date.js lib, it adds function Date.parseExact so you can just do Date.parseExact(dateString,"dd/MM/yyyy"). It fails when month is 00, but its still usefull.

    0 讨论(0)
  • 2020-12-01 15:54

    you can use regular exp to validate date . try like this :

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

    note: this will only work for dd/mm/yyyy

    for exact match of your requirement use

     re = /^\d{2}\/\d{2}\/\d{4}$/; 
    
    0 讨论(0)
提交回复
热议问题