#

API Docs for: 3.10.3
Show: Inherited Protected Private Deprecated

# File: date/js/date-math.js

    /**
     * Date Math submodule.
     *
     * @module datatype-date
     * @submodule datatype-date-math
     * @for Date
     */
    var LANG = Y.Lang;

    Y.mix(Y.namespace("Date"), {

    	/**
    	 * Checks whether a native JavaScript Date contains a valid value.
    	 * @for Date
    	 * @method isValidDate
    	 * @param oDate {Date} Date in the month for which the number of days is desired.
    	 * @return {Boolean} True if the date argument contains a valid value.
    	 */
    	 isValidDate : function (oDate) {
    		if(LANG.isDate(oDate) && (isFinite(oDate)) && (oDate != "Invalid Date") && !isNaN(oDate) && (oDate != null)) {
                return true;
            }
            else {
                Y.log("Could not validate data as type Date", "warn", "date");
                return false;
            }
    	},

    	/**
    	 * Checks whether two dates correspond to the same date and time.
    	 * @for Date
    	 * @method areEqual
    	 * @param aDate {Date} The first date to compare.
    	 * @param bDate {Date} The second date to compare.
    	 * @return {Boolean} True if the two dates correspond to the same
    	 * date and time.
    	 */
    	areEqual : function (aDate, bDate) {
    		return (this.isValidDate(aDate) && this.isValidDate(bDate) && (aDate.getTime() == bDate.getTime()));
    	},

    	/**
    	 * Checks whether the first date comes later than the second.
    	 * @for Date
    	 * @method isGreater
    	 * @param aDate {Date} The first date to compare.
    	 * @param bDate {Date} The second date to compare.
    	 * @return {Boolean} True if the first date is later than the second.
    	 */
        isGreater : function (aDate, bDate) {
        	return (this.isValidDate(aDate) && this.isValidDate(bDate) && (aDate.getTime() > bDate.getTime()));
        },

    	/**
    	 * Checks whether the first date comes later than or is the same as
    	 * the second.
    	 * @for Date
    	 * @method isGreaterOrEqual
    	 * @param aDate {Date} The first date to compare.
    	 * @param bDate {Date} The second date to compare.
    	 * @return {Boolean} True if the first date is later than or
    	 * the same as the second.
    	 */
        isGreaterOrEqual : function (aDate, bDate) {
        	return (this.isValidDate(aDate) && this.isValidDate(bDate) && (aDate.getTime() >= bDate.getTime()));
        },

        /**
    	 * Checks whether the date is between two other given dates.
    	 * @for Date
    	 * @method isInRange
    	 * @param aDate {Date} The date to check
    	 * @param bDate {Date} Lower bound of the range.
    	 * @param cDate {Date} Higher bound of the range.
    	 * @return {Boolean} True if the date is between the two other given dates.
    	 */
        isInRange : function (aDate, bDate, cDate) {
        	return (this.isGreaterOrEqual(aDate, bDate) && this.isGreaterOrEqual(cDate, aDate));
        },

    	/**
    	 * Adds a specified number of days to the given date.
    	 * @for Date
    	 * @method addDays
    	 * @param oDate {Date} The date to add days to.
    	 * @param numDays {Number} The number of days to add (can be negative)
    	 * @return {Date} A new Date with the specified number of days
    	 * added to the original date.
    	 */
    	addDays : function (oDate, numDays) {
    		return new Date(oDate.getTime() + 86400000*numDays);
    	},

    	/**
    	 * Adds a specified number of months to the given date.
    	 * @for Date
    	 * @method addMonths
    	 * @param oDate {Date} The date to add months to.
    	 * @param numMonths {Number} The number of months to add (can be negative)
    	 * @return {Date} A new Date with the specified number of months
    	 * added to the original date.
    	 */
    	addMonths : function (oDate, numMonths) {
    		var newYear = oDate.getFullYear();
    		var newMonth = oDate.getMonth() + numMonths;

    		newYear  = Math.floor(newYear + newMonth / 12);
    		newMonth = (newMonth % 12 + 12) % 12;

    		var newDate = new Date (oDate.getTime());
    		newDate.setFullYear(newYear);
    		newDate.setMonth(newMonth);

    		return newDate;
    	},

    	/**
    	 * Adds a specified number of years to the given date.
    	 * @for Date
    	 * @method addYears
    	 * @param oDate {Date} The date to add years to.
    	 * @param numYears {Number} The number of years to add (can be negative)
    	 * @return {Date} A new Date with the specified number of years
    	 * added to the original date.
    	 */
    	addYears : function (oDate, numYears) {
    		var newYear = oDate.getFullYear() + numYears;
    		var newDate = new Date(oDate.getTime());

    		newDate.setFullYear(newYear);
    		return newDate;
    	},

    	/**
    	 * Lists all dates in a given month.
    	 * @for Date
    	 * @method listOfDatesInMonth
    	 * @param oDate {Date} The date corresponding to the month for
    	 * which a list of dates is required.
    	 * @return {Array} An `Array` of `Date`s from a given month.
    	 */
        listOfDatesInMonth : function (oDate) {
           if (!this.isValidDate(oDate)) {
           	 return [];
           }

           var daysInMonth = this.daysInMonth(oDate),
               year        = oDate.getFullYear(),
               month       = oDate.getMonth(),
               output      = [];

           for (var day = 1; day <= daysInMonth; day++) {
           	   output.push(new Date(year, month, day, 12, 0, 0));
           }

           return output;
        },

    	/**
    	 * Takes a native JavaScript Date and returns the number of days
    	 * in the month that the given date belongs to.
    	 * @for Date
    	 * @method daysInMonth
    	 * @param oDate {Date} Date in the month for which the number
    	 * of days is desired.
    	 * @return {Number} A number (either 28, 29, 30 or 31) of days
    	 * in the given month.
    	 */
    	 daysInMonth : function (oDate) {
    		if (!this.isValidDate(oDate)) {
    			return 0;
    		}

    		var mon = oDate.getMonth();
    		var lengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

    		if (mon != 1) {
    			return lengths[mon];
    		}
    		else {

    			var year = oDate.getFullYear();
    			if (year%400 === 0) {
    			       return 29;
    			}
    			else if (year%100 === 0) {
    				   return 28;
    			}
    			else if (year%4 === 0) {
    			       return 29;
    			}
    			else {
    			       return 28;
    		    }
    	   }
    	}

    });

    Y.namespace("DataType");
    Y.DataType.Date = Y.Date;