4

Is there a fast way to validate that a date/time in this format is valid? I would prefer not to breaking it down with substrings and rebuilding it if possible

"YYYY-MM-DD HH:MM:SS"

0

5 Answers 5

6

You could parse the date string as an ISO string (by converting the space to a "T" and appending the Zulu timezone, e.g. "2011-08-16T12:34:56Z") then compare the resulting date's ISO string to the original ISO string.

function isValidDateString(s) {
  try {
    var isoStr = (""+s).replace(/ /,'T') + "Z"
      , newStr = new Date(isoStr).toISOString();
    return isoStr.slice(0,19) == newStr.slice(0,19);
  } catch (e) {
    return false;
  }
}

This way, if the date string has invalid format, then the string "Invalid Date" will not equal the original and if it were to roll (e.g. if the day was invalid for the month) then the string value of the parsed date will not equal the original string.

[Edit]

Note the changes to the example code required by the timezone fix.

Sign up to request clarification or add additional context in comments.

1 Comment

+1 The easiest way to validate a date is by parsing it. It's possible with a regular expression, but the expression gets insanely complicated in order to handle month lenghts and leap years correctly.
0

Try a regular expression like this. Edit: Here is the string you'll want to match against:

^([1-3][0-9]{3,3})-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2][1-9]|3[0-1])\s([0-1][0-9]|2[0-4]):([0-5][0-9]):([0-5][0-9])$

Comments

0

You can use this regex.

/^([0-9]{4})-([0-1][0-9])-([0-3][0-9])\s([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])$/.test("2007-08-04 18:01:01"); //true
/^([0-9]{4})-([0-1][0-9])-([0-3][0-9])\s([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])$/.test("2007-08-04 18:01:0"); //false

2 Comments

Except your regex passes the date "2010-02-30 01:01:01" which is invalid (since Feb 2010 had no 30th day)...
Haha, that was an example, but nice catch. The regex does not check whether it's a valid date, it merely checks whether it matches the format the OP asked for.
0

The following code below will check to see if the date input is actually a valid date.

At first glance it looks big, but it's mostly the comments.

It requires no substrings and no regular expression.

The way JavaScript works is that, if you break down a Date object with an invalid date (04/32/2010) to it's total milliseconds and then create another Date object with those milliseconds, it will not create a Date object that displays the incorrect date (04/32/2010) it will compensate and create the proper Date (05/01/2010).

So simply, if the input is different than the new Date object, then the date is not valid.

http://jsfiddle.net/dceast/vmHjN/ - Here is an example of it on JSFiddle.

var compareDate, checkDates = false;
var validateObject = {
    init: function(year, month, day) {
        return this.compareDate.init(year, month, day);
    },
    compareDate: {
        init: function(year, month, day) {
            var isValid = false;
            // Compensate for zero based index, if month was not
            // subtracted from one 0 === Jan, 1 === Feb, 2 === Mar
            month -= 1;

            // Create a new date object with the selected
            // year, month, and day values and retrieve the
            // milliseconds from it.
            var mSeconds = (new Date(year, month, day)).getTime();
            var objDate = new Date();

            // Set the time of the object to the milliseconds 
            // retrieved from the original date. This will
            // convert it to a valid date.
            objDate.setTime(mSeconds);

            // Compare if the date has changed, if it has then
            // the date is not valid 
            if (objDate.getFullYear() === year &&
                objDate.getMonth() === month &&
                objDate.getDate() === day) 
            {
                isValid = true;
            }
            return isValid;
        }
    }
};

Comments

0

I did so and it worked

<html>
<head>
<title>valida data</title>
<script>
function valData(data){//dd/mm/aaaa

day = data.substring(0,2);
month = data.substring(3,5);
year = data.substring(6,10);

if( (month==01) || (month==03) || (month==05) || (month==07) || (month==08) || (month==10) || (month==12) )    {//months 31 days
if( (day < 01) || (day > 31) ){
alert('invalid date');
}
} else

if( (month==04) || (month==06) || (month==09) || (month==11) ){//months 30 days
if( (day < 01) || (day > 30) ){
alert('invalid date');
}
} else

if( (month==02) ){//February and leap year
if( (year % 4 == 0) && ( (year % 100 != 0) || (year % 400 == 0) ) ){
if( (day < 01) || (day > 29) ){
    alert('invalid date');
}
} else {
if( (day < 01) || (day > 28) ){
    alert('invalid date');
}
}
}

}
</script>
</head>
<body>
<form>
<input type="text" name="data" id="data" onBlur="return valData(this.value)" />
</form>
</body>
</html>

5 Comments

What is that? Where is mes,dia,ano defined? What are you trying with (mes=01)? Could you explain your answer without using portuguese? edit Who upvoted this?
fix for you my friend, this (month = 01) should thus be (month == 01)
there is still a wrong operator in (month=02) edit and we still dont know where month,day and year is defined
the date is passed to the function as a parameter, dd/mm/yyyy
The User who asked you something doesnt knows how to use your answer if you dont provide all informations about the variables. You shoud declare them in the head of you function.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.