JSFiddle - React, Tailwind, and code Playground

JavaScript

// please fork before modifying
var dateMath = function(aDate) {
    // var dat = new Date();
    var dat = aDate;
    dat.setHours(0, 0, 0, 0);
    var LDOM = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // Last Day Of Month
    var setDate_ = function(aDate) {
        dat = aDate;
        dat.setHours(0, 0, 0, 0); // set to midnight
    };

    var getDate_ = function() {
        return dat;
    };

    // update for century rules (someday!)
    var isLeapYear = function() {
        return 0 === dat.getFullYear() % 4;
    };

    var getLastDayFeb = function() {
        return isLeapYear() ? 29 : LDOM[1];
    };

    var isLastDay_ = function() {
        return dat.getMonth() !== 1 ? dat.getDate() === LDOM[dat.getMonth()] : dat.getDate() === getLastDayFeb();
    };

    var addDays_ = function(days) {
        return dat.setDate(dat.getDate() + days);
    };

    var addWeeks_ = function(weeks) {
        return dat.setDate(dat.getDate() + weeks * 7);
    };

    var addMonths_ = function(months) {
        var d1 = dat.getDate();
        dat.setMonth(dat.getMonth() + months);
        //alert(dat.getDate() +"\n"+d1);        
        if (dat.getDate() !== d1) {
            //addDays_(-1);  // Does not work. Jan 31, 2012 + 1 month = March 2nd, 2012
            addDays_(-dat.getDate());
        }
        return dat;
    };

    var monthsBetweenDates = function() {
        // TODO:
    };

    // dateMathObj = {
    return {
        isLastDay: isLastDay_,
        addDays: addDays_,
        addWeeks: addWeeks_,
        addMonths: addMonths_,
        getDate: getDate_,
        setDate: setDate_
    };
    // return dateMathObj;
}(new Date());

dateMath.addDays(180); // add 180 days to current date
alert(dateMath.getDate() + "\n" + dateMath.isLastDay());

dateMath.setDate(new Date(2012, 9, 31)); // test last day of month method
alert(dateMath.getDate() + "\n" + dateMath.isLastDay());

dateMath.setDate(new Date(2012, 2, 31)); // add 1 month to Mar 31 and is it last...