komedit1
komedit1

Reputation: 255

javascript date validation using date object

According to http://www.codingforums.com/archive/index.php/t-98569.html, the date validation could be done using the javascript's date object.

I've a similar scenario, where I have individual year,month,date in seperate text boxes which get validated by regular expressions.Now I would like to leverage the JS's date object to check stuff like days in a month and leap year validation which are not done by RegExp validation. But the stuff discussed in the above link doesn't quite work for me. For example,

<script type="text/javascript">
   var dy= new Date(2001,2,30);
   alert(dy.getFullYear()+" "+dy.getMonth()+" "+dy.getDate());
</script>

returns the date as it is. Shouldn't dy.getMonth() return something like -1 to show that 30 days doesn't exist in the month of February?. If this isn't possible using Date object, please suggest some alternatives to validate the date.

Update: I just found another link(http://internotredici.com/article/checkdateinjavascript/) which says the same. PS:I am working on JS1.2 which is pretty old.

Upvotes: 3

Views: 6940

Answers (3)

Dinesh Lomte
Dinesh Lomte

Reputation: 609

This may help some one. Have written some methods which will get perform the date validations. There could be some better ways but I have come up with these. This help in validating the dates on locale based formats. NOTE: date format and date string as provided in the input fields go hand in hand.

<script type="text/javascript">
        function validate() {

            var format = 'yyyy-MM-dd';

            if(isAfterCurrentDate(document.getElementById('start').value, format)) {
                alert('Date is after the current date.');
            } else {
                alert('Date is not after the current date.');
            }
            if(isBeforeCurrentDate(document.getElementById('start').value, format)) {
                alert('Date is before current date.');
            } else {
                alert('Date is not before current date.');
            }
            if(isCurrentDate(document.getElementById('start').value, format)) {
                alert('Date is current date.');
            } else {
                alert('Date is not a current date.');
            }
            if (isBefore(document.getElementById('start').value, document.getElementById('end').value, format)) {
                alert('Start/Effective Date cannot be greater than End/Expiration Date');
            } else {
                alert('Valid dates...');
            }
            if (isAfter(document.getElementById('start').value, document.getElementById('end').value, format)) {
                alert('End/Expiration Date cannot be less than Start/Effective Date');
            } else {
                alert('Valid dates...');
            }
            if (isEquals(document.getElementById('start').value, document.getElementById('end').value, format)) {
                alert('Dates are equals...');
            } else {
                alert('Dates are not equals...');
            }
            if (isDate(document.getElementById('start').value, format)) {
                alert('Is valid date...');
            } else {
                alert('Is invalid date...');
            }
        }

        /**
         * This method gets the year index from the supplied format
         */
        function getYearIndex(format) {

            var tokens = splitDateFormat(format);

            if (tokens[0] === 'YYYY'
                    || tokens[0] === 'yyyy') {
                return 0;
            } else if (tokens[1]=== 'YYYY'
                    || tokens[1] === 'yyyy') {
                return 1;
            } else if (tokens[2] === 'YYYY'
                    || tokens[2] === 'yyyy') {
                return 2;
            }
            // Returning the default value as -1
            return -1;
        }

        /**
         * This method returns the year string located at the supplied index
         */
        function getYear(date, index) {

            var tokens = splitDateFormat(date);
            return tokens[index];
        }

        /**
         * This method gets the month index from the supplied format
         */
        function getMonthIndex(format) {

            var tokens = splitDateFormat(format);

            if (tokens[0] === 'MM'
                    || tokens[0] === 'mm') {
                return 0;
            } else if (tokens[1] === 'MM'
                    || tokens[1] === 'mm') {
                return 1;
            } else if (tokens[2] === 'MM'
                    || tokens[2] === 'mm') {
                return 2;
            }
            // Returning the default value as -1
            return -1;
        }

        /**
         * This method returns the month string located at the supplied index
         */
        function getMonth(date, index) {

            var tokens = splitDateFormat(date);
            return tokens[index];
        }

        /**
         * This method gets the date index from the supplied format
         */
        function getDateIndex(format) {

            var tokens = splitDateFormat(format);

            if (tokens[0] === 'DD'
                    || tokens[0] === 'dd') {
                return 0;
            } else if (tokens[1] === 'DD'
                    || tokens[1] === 'dd') {
                return 1;
            } else if (tokens[2] === 'DD'
                    || tokens[2] === 'dd') {
                return 2;
            }
            // Returning the default value as -1
            return -1;
        }

        /**
         * This method returns the date string located at the supplied index
         */
        function getDate(date, index) {

            var tokens = splitDateFormat(date);
            return tokens[index];
        }

        /**
         * This method returns true if date1 is before date2 else return false
         */
        function isBefore(date1, date2, format) {
            // Validating if date1 date is greater than the date2 date
            if (new Date(getYear(date1, getYearIndex(format)), 
                    getMonth(date1, getMonthIndex(format)) - 1, 
                    getDate(date1, getDateIndex(format))).getTime()
                > new Date(getYear(date2, getYearIndex(format)), 
                    getMonth(date2, getMonthIndex(format)) - 1, 
                    getDate(date2, getDateIndex(format))).getTime()) {
                return true;
            } 
            return false;                
        }

        /**
         * This method returns true if date1 is after date2 else return false
         */
        function isAfter(date1, date2, format) {
            // Validating if date2 date is less than the date1 date
            if (new Date(getYear(date2, getYearIndex(format)), 
                    getMonth(date2, getMonthIndex(format)) - 1, 
                    getDate(date2, getDateIndex(format))).getTime()
                < new Date(getYear(date1, getYearIndex(format)), 
                    getMonth(date1, getMonthIndex(format)) - 1, 
                    getDate(date1, getDateIndex(format))).getTime()
                ) {
                return true;
            } 
            return false;                
        }

        /**
         * This method returns true if date1 is equals to date2 else return false
         */
        function isEquals(date1, date2, format) {
            // Validating if date1 date is equals to the date2 date
            if (new Date(getYear(date1, getYearIndex(format)), 
                    getMonth(date1, getMonthIndex(format)) - 1, 
                    getDate(date1, getDateIndex(format))).getTime()
                === new Date(getYear(date2, getYearIndex(format)), 
                    getMonth(date2, getMonthIndex(format)) - 1, 
                    getDate(date2, getDateIndex(format))).getTime()) {
                return true;
            } 
            return false;
        }

        /**
         * This method validates and returns true if the supplied date is 
         * equals to the current date.
         */
        function isCurrentDate(date, format) {
            // Validating if the supplied date is the current date
            if (new Date(getYear(date, getYearIndex(format)), 
                    getMonth(date, getMonthIndex(format)) - 1, 
                    getDate(date, getDateIndex(format))).getTime()
                === new Date(new Date().getFullYear(), 
                        new Date().getMonth(), 
                        new Date().getDate()).getTime()) {
                return true;
            } 
            return false;                
        }

        /**
         * This method validates and returns true if the supplied date value 
         * is before the current date.
         */
        function isBeforeCurrentDate(date, format) {
            // Validating if the supplied date is before the current date
            if (new Date(getYear(date, getYearIndex(format)), 
                    getMonth(date, getMonthIndex(format)) - 1, 
                    getDate(date, getDateIndex(format))).getTime()
                < new Date(new Date().getFullYear(), 
                        new Date().getMonth(), 
                        new Date().getDate()).getTime()) {
                return true;
            } 
            return false;                
        }

        /**
         * This method validates and returns true if the supplied date value 
         * is after the current date.
         */
        function isAfterCurrentDate(date, format) {
            // Validating if the supplied date is before the current date
            if (new Date(getYear(date, getYearIndex(format)), 
                    getMonth(date, getMonthIndex(format)) - 1, 
                    getDate(date, getDateIndex(format))).getTime()
                > new Date(new Date().getFullYear(),
                        new Date().getMonth(), 
                        new Date().getDate()).getTime()) {
                return true;
            } 
            return false;                
        }

        /**
         * This method splits the supplied date OR format based 
         * on non alpha numeric characters in the supplied string.
         */
        function splitDateFormat(dateFormat) {
            // Spliting the supplied string based on non characters
            return dateFormat.split(/\W/);
        }

        /*
         * This method validates if the supplied value is a valid date.
         */
        function isDate(date, format) {                
            // Validating if the supplied date string is valid and not a NaN (Not a Number)
            if (!isNaN(new Date(getYear(date, getYearIndex(format)), 
                    getMonth(date, getMonthIndex(format)) - 1, 
                    getDate(date, getDateIndex(format))))) {                    
                return true;
            } 
            return false;                                      
        }
    </script>

HTML date associated input fields

<input type="text" name="start" id="start" size="10" value="" />
<br/>
<input type="text" name="end" id="end" size="10" value="" />
<br/>
<input type="button" value="Submit" onclick="javascript:validate();" />

Upvotes: 2

kennebec
kennebec

Reputation: 104830

You can make the date from the day, month, year bits, and then check that the bits are correct.

function isvalid_mdy(s){
    var day, A= s.split(/\D+/).map(function(itm,i){return parseInt(itm,10)});
    A[0]-=1;
    try{
        day= new Date(A[2], A[0], A[1]);
        if(day.getMonth()== A[0] && day.getDate()== A[1]) return day;
        throw new Error('Bad Date ');
    }
    catch(er){
        return er.message;
    }
}
function isvalid_dmy(s){
    var day, A= s.split(/\D+/).map(function(itm,i){return parseInt(itm,10)});
    A[1]-=1;
    try{
        day= new Date(A[2], A[1], A[0]);
        if(day.getMonth()== A[1] && day.getDate()== A[0]) return day;
        throw new Error('Bad Date ');
    }
    catch(er){
        return er.message;
    }
}

Upvotes: 6

Felipe Cruz
Felipe Cruz

Reputation: 940

In JS, monht starts by 0, so 0=Jan,1=Feb,2=Mar

30,1 (30 FEB) will be 2 Mar

You will have to test this by yourself..

This can help you - validate-date

Upvotes: 1

Related Questions