INTELLIGENT WORK FORUMS
FOR COMPUTER PROFESSIONALS

Log In

Come Join Us!

Are you a
Computer / IT professional?
Join Tek-Tips Forums!
  • Talk With Other Members
  • Be Notified Of Responses
    To Your Posts
  • Keyword Search
  • One-Click Access To Your
    Favorite Forums
  • Automated Signatures
    On Your Posts
  • Best Of All, It's Free!

*Tek-Tips's functionality depends on members receiving e-mail. By joining you are opting in to receive e-mail.

Posting Guidelines

Promoting, selling, recruiting, coursework and thesis posting is forbidden.

Jobs

Date format

How to validate and re-format date inputs (default set to DD-MON-YYYY) by joezapp
Posted: 4 May 01

The script is pretty big and I'm reasonably new to Javascript so I'm sure it could be written more efficiently.   I looked for a script that was reasonably exhaustive as my users are impatient and don't want to worry about how they enter their dates, couldn't find exactly what I wanted so bastardised a few scripts and came up with this  

 It'll take pretty much any input (1.1.4, 24*DEC*2001, 010104 etc) and validate it before returning DD-MON-YYYY (I used it in an Oracle form).  It should be easy to change this to whatever output you're after.

Hope it's useful...

Joe.

function isDateorNull(theElement, theElementName) {
    var CorrectDate;
    var SplitDate;
    var thisDay;
    var thisMonth;
    var thisYear;
    var inpDate        = theElement.value;
    var DayArray     = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    var MonthArray    = new Array("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC");
    var CockUp         = 0;
    
    // kill if nothing there
    if (inpDate.length == 0 ) return true;
    
    // numerical dates first for DDMMYYYY OR DDMMYY
    if (/^[0-9]{3}$/.test(inpDate.substr(1,3))) {
        
        if         (/^[0-9]{8}/.test(inpDate)) {thisDay = inpDate.substr(0,2);    thisMonth = inpDate.substr(2,2);     thisYear = inpDate.substr(4,4);}
        else if (/^[0-9]{6}/.test(inpDate)) {thisDay = inpDate.substr(0,2);    thisMonth = inpDate.substr(2,2);     thisYear = inpDate.substr(4,2);}
        else    {CockUp = 1;}
    }
    // now alpha numeric dates for DDMONYYYY, DMONYYYY, DDMONYY, DMONYY, DDMONY, DMONY or MONYY
    else if (/^[a-zA-Z|0-9]{3}$/.test(inpDate.substr(1,3))) {
        
        if         (/^[0-9|a-zA-Z]{9}/.test(inpDate))    {thisDay   = inpDate.substr(0,2);    thisMonth = inpDate.substr(2,3).toUpperCase();    thisYear  = inpDate.substr(5,4);}
        else if (/^[0-9|a-zA-Z]{8}/.test(inpDate))  {thisDay   = inpDate.substr(0,1);    thisMonth = inpDate.substr(1,3).toUpperCase();    thisYear  = inpDate.substr(4,4);}
        else if (/^[0-9|a-zA-Z]{7}/.test(inpDate))  {thisDay   = inpDate.substr(0,2);    thisMonth = inpDate.substr(2,3).toUpperCase();    thisYear  = inpDate.substr(5,2);}
        else if (/^[0-9|a-zA-Z]{6}/.test(inpDate))  {if (/^[a-zA-Z]{1}/.test(inpDate.substr(1,1))) {thisDay = inpDate.substr(0,1);        thisMonth = inpDate.substr(1,3).toUpperCase();    thisYear = inpDate.substr(4,2);}
                                                else {thisDay = inpDate.substr(0,2);        thisMonth = inpDate.substr(2,3).toUpperCase();    thisYear  = inpDate.substr(3,2);}}
        else    {CockUp = 1;}
                
    }
    // lastly pick up every conceivable special character or kick out with error
    else {
        if          (/-/.test(inpDate))     {SplitDate = inpDate.split("-");}
        else if (/\//.test(inpDate))    {SplitDate = inpDate.split("/");}
        else if (/\./.test(inpDate))    {SplitDate = inpDate.split(".");}
        else if (/,/.test(inpDate))     {SplitDate = inpDate.split(",");}
        else if (/\;/.test(inpDate))     {SplitDate = inpDate.split(";");}
        else if (/\:/.test(inpDate))     {SplitDate = inpDate.split(":");}
        else if (/\*/.test(inpDate))     {SplitDate = inpDate.split("*");}
        else if (/_/.test(inpDate))     {SplitDate = inpDate.split("_");}
        else if (/%/.test(inpDate))     {SplitDate = inpDate.split("%");}
        else     {CockUp = 1;}
        thisDay          = SplitDate[0];      
        thisMonth   = SplitDate[1].toUpperCase();   
        thisYear    = SplitDate[2];
    }
    
    // request reinput data if nonexistent
    if (!thisYear)     {CockUp = 1;}
    if (!thisMonth) {CockUp = 1;}
    if (!thisDay)     {CockUp = 1;}
    
    // kick out any errors before we do any formatting etc
    if (CockUp == 1) {
        alert("Your input date format is incorrect or contains invalid characters - please try again using DD-MON-YYYY");
        theElement.focus();
        return false;
    }
        
    // change from numeric to alpha-numeric
    if (/^[0-9]{1}$/.test(thisMonth.substr(0,1))) {
        switch (thisMonth) {
            case "01" : case "1" : thisMonth = 'JAN'; break;
            case "02" : case "2" : thisMonth = 'FEB'; break;
            case "03" : case "3" : thisMonth = 'MAR'; break;
            case "04" : case "4" : thisMonth = 'APR'; break;
            case "05" : case "5" : thisMonth = 'MAY'; break;
            case "06" : case "6" : thisMonth = 'JUN'; break;
            case "07" : case "7" : thisMonth = 'JUL'; break;
            case "08" : case "8" : thisMonth = 'AUG'; break;
            case "09" : case "9" : thisMonth = 'SEP'; break;
            case "10" : thisMonth = 'OCT'; break;
            case "11" : thisMonth = 'NOV'; break;
            case "12" : thisMonth = 'DEC'; break;
            default      : alert("Your input month is incorrect, it should be between 1 and 12"); theElement.focus(); return false;
        }
    }
    
    // sort variable lengths out and build date
    if (thisDay.length  == 1) {thisDay = "0" + thisDay;}
    if (thisYear.length == 1) {thisYear = "200" + thisYear;}
    if (thisYear.length == 2) {if (thisYear >= 50) {thisYear = "19" + thisYear; } else {thisYear = "20" + thisYear;}}
    CorrectDate = thisDay + "-" + thisMonth + "-" + thisYear;
    
    // Check alpha-numeric Valid Month
    var filter=/JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC/;
    if (! filter.test(thisMonth)) {
        alert("Please enter a Correct Month");
        theElement.focus();
        return false;
    }
    
    // Check For Leap Year
      N=thisYear;
      if ( ( N%4==0 && N%100 !=0 ) || ( N%400==0 ) ) {
          DayArray[1]=29;    
      }
    
    // check for correct days in month
    for(var ctr=0; ctr<=11; ctr++){
        if (MonthArray[ctr]==thisMonth) {
            if (thisDay<= DayArray[ctr] && thisDay >0 ) {
                CockUp = 0;
            } else {
                alert("Your day input is incorrect for the month in question");
                theElement.focus();
                return false;
                CockUp = 1;
            }
        }
        if (CockUp == 0) {
            theElement.value = CorrectDate;
        }
    }
}

Back to Javascript FAQ Index
Back to Javascript Forum

My Archive

Resources

Close Box

Join Tek-Tips® Today!

Join your peers on the Internet's largest technical computer professional community.
It's easy to join and it's free.

Here's Why Members Love Tek-Tips Forums:

Register now while it's still free!

Already a member? Close this window and log in.

Join Us             Close