Click here to Skip to main content
Click here to Skip to main content

Tagged as

JavaScript Date Validation

, 29 Nov 2012 CPOL
Rate this:
Please Sign up or sign in to vote.
JavaScript Date Validation
For a few days now, I have been battling with the problem of JavaScript date validation. I wanted to validate text inputed by a user as they were typing to tell them if it was a valid date. After much searching on the internet, I found nothing that worked. So I wrote the following code to do the job, it is a simple but effective isDate function:
 
//Value parameter - required. All other parameters are optional.
function isDate(value, sepVal, dayIdx, monthIdx, yearIdx) {
    try {
        //Change the below values to determine which format of date you wish to check. It is set to dd/mm/yyyy by default.
        var DayIndex = dayIdx !== undefined ? dayIdx : 0; 
        var MonthIndex = monthIdx !== undefined ? monthIdx : 0;
        var YearIndex = yearIdx !== undefined ? yearIdx : 0;
 
        value = value.replace(/-/g, "/").replace(/\./g, "/"); 
        var SplitValue = value.split(sepVal || "/");
        var OK = true;
        if (!(SplitValue[DayIndex].length == 1 || SplitValue[DayIndex].length == 2)) {
            OK = false;
        }
        if (OK && !(SplitValue[MonthIndex].length == 1 || SplitValue[MonthIndex].length == 2)) {
            OK = false;
        }
        if (OK && SplitValue[YearIndex].length != 4) {
            OK = false;
        }
        if (OK) {
            var Day = parseInt(SplitValue[DayIndex], 10);
            var Month = parseInt(SplitValue[MonthIndex], 10);
            var Year = parseInt(SplitValue[YearIndex], 10);
 
            if (OK = ((Year > 1900) && (Year < new Date().getFullYear()))) {
                if (OK = (Month <= 12 && Month > 0)) {

                    var LeapYear = (((Year % 4) == 0) && ((Year % 100) != 0) || ((Year % 400) == 0));   
                    
                    if(OK = Day > 0)
                    {
                        if (Month == 2) {  
                            OK = LeapYear ? Day <= 29 : Day <= 28;
                        } 
                        else {
                            if ((Month == 4) || (Month == 6) || (Month == 9) || (Month == 11)) {
                                OK = Day <= 30;
                            }
                            else {
                                OK = Day <= 31;
                            }
                        }
                    }
                }
            }
        }
        return OK;
    }
    catch (e) {
        return false;
    }
} 
 
Just copy the above function and call isDate(value) where value is a string containing a valid or invalid date. The function returns a bool true if the string was a date and false if it wasn't. Hope this helps! Smile | <img src= " />
 
EDIT: Thanks to Member 2792937 for bringing a bug to my attention.
 
Both parseInt('08') and parseInt('09') return zero because the function tries to determine the correct base for the numerical system used. In JavaScript, numbers starting with zero are considered octal and there's no 08 or 09 in octal, hence the problem.
 
To fix this, just add the second parameter for parseInt, the base to be used for the conversion. The correct calls should be parseInt('08', 10) and parseInt('09', 10).

(From http://www.ventanazul.com/webzine/articles/issues-parseint-javascript[^])
 
I have modified my code to fix this issue.

EDIT: Now includes optional parameters for specifying separator value and the indexes. To miss out a parameter simply pass in undefined. Thanks to Lester Callif for the suggestions.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Ed Nutting
Founder
United Kingdom United Kingdom
Hi there, so you're reading this? I probably ought to tell you something helpful then...
 
Okay well, I'm 17 from London, UK and I have been programming since I was 8 years old. You'll see from my profile I've dabbled in a lot of different areas and I do know what I'm talking about so as they say "gimme some respect yeah?" Smile | :) I've done GCSE's (got 7A*'s, 2A's and a B in French) and am now studying for my AS-Levels (Math, Further Maths, Physics and Chemistry). My main aim is to go to university to study electronic engineering and then work in robotics (preferably humanoid but most of the field is interesting).
 
Thanks for reading,
Edward Nutting
Follow on   Twitter

Comments and Discussions

 
BugDefault day, month, year indexes will not work. Also, param sepVal is not working properly. PinmemberMin Htun Zaw5-Oct-13 0:51 
SuggestionNewer version [modified] PinmemberMaster DJon5-Dec-12 6:24 
GeneralRe: Newer version Pinmemberjoni8a5-Mar-13 3:30 
AnswerRe: Newer version PinmemberMaster DJon5-Mar-13 7:10 
AnswerRe: Newer version PinmemberMaster DJon5-Mar-13 8:55 
QuestionShorter code Pinmemberredphx4-Dec-12 20:13 
QuestionAlternative to parseInt() PinmemberXunrel4-Dec-12 6:03 
QuestionImpressive, but have a couple of mods that should take care of both the date format and the separator for diff countries. PinmemberLester Callif27-Nov-12 15:46 
AnswerRe: Impressive, but have a couple of mods that should take care of both the date format and the separator for diff countries. PinmemberEd Nutting29-Nov-12 10:52 
GeneralRe: Impressive, but have a couple of mods that should take care of both the date format and the separator for diff countries. PinmemberLester Callif29-Nov-12 12:50 
AnswerRe: Impressive, but have a couple of mods that should take care of both the date format and the separator for diff countries. PinmemberEd Nutting30-Nov-12 9:16 
AnswerRe: Impressive, but have a couple of mods that should take care of both the date format and the separator for diff countries. PinmemberEd Nutting29-Nov-12 11:01 
QuestionJust one bug in February PinmemberMember 324090521-Nov-12 12:37 
AnswerRe: Just one bug in February PinmemberEd Nutting25-Nov-12 11:09 
QuestionDesign flaw in your code PinmemberMember 942879613-Sep-12 13:38 
AnswerRe: Design flaw in your code PinmemberEd Nutting13-Sep-12 20:26 
BugYear Validation PinmemberXtremLucky24-Apr-12 3:05 
GeneralRe: Year Validation PinmemberEd Nutting24-Apr-12 6:16 
GeneralRe: Year Validation Pinmembergreg_ryan17-Jul-12 12:54 
GeneralMinor Bug Fix for the non-slash people... PinmemberEd Nutting13-Mar-12 12:11 
GeneralI am *very* surprised that none of our North American friend... PinmemberPeter_in_278026-Sep-11 16:15 
GeneralRe: Yes I guess that is a little surprising. But then again, I w... PinmemberEdward Nutting26-Sep-11 20:19 
GeneralReason for my vote of 5 found to be complete, simple and ele... Pinmemberrquadros25-Jul-11 12:34 
QuestionBug with year validation PinmemberMember 842090121-Nov-11 5:59 
AnswerRe: Bug with year validation PinmemberEdward Nutting21-Nov-11 9:42 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web04 | 2.8.141022.2 | Last Updated 29 Nov 2012
Article Copyright 2011 by Ed Nutting
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid