JSFiddle - React, Tailwind, and code Playground

HTML

<pre id="output"></pre>

JavaScript

/**
 * Adds time to a date. Modelled after MySQL DATE_ADD function.
 * Example: dateAdd(new Date(), 'minutes', 30)  //returns 30 minutes from now.
 * 
 * @param date  Date to start with
 * @param interval  One of: year, quarter, month, week, day, hour, minute, second
 * @param units  Number of units of the given interval to add.
 */
function dateAdd(date, interval, units) {
  if(!(date instanceof Date))
    return undefined;
  var ret = new Date(date); //don't change original date
  var checkRollover = function() { if(ret.getDate() != date.getDate()) ret.setDate(0);};
  switch(String(interval).toLowerCase()) {
    case 'year'   :  ret.setFullYear(ret.getFullYear() + units); checkRollover();  break;
    case 'quarter':  ret.setMonth(ret.getMonth() + 3*units); checkRollover();  break;
    case 'month'  :  ret.setMonth(ret.getMonth() + units); checkRollover();  break;
    case 'week'   :  ret.setDate(ret.getDate() + 7*units);  break;
    case 'day'    :  ret.setDate(ret.getDate() + units);  break;
    case 'hour'   :  ret.setTime(ret.getTime() + units*3600000);  break;
    case 'minute' :  ret.setTime(ret.getTime() + units*60000);  break;
    case 'second' :  ret.setTime(ret.getTime() + units*1000);  break;
    default       :  ret = undefined;  break;
  }
  return ret;
}

d = new Date('2016-02-29 12:00:00');
out('start:      ' + d);
out('----------------');
out('+1 year:    ' + dateAdd(d, 'YEAR', 1));
out('+1 quarter: ' + dateAdd(d, 'QUARTER', 1));
out('+1 month:   ' + dateAdd(d, 'MONTH', 1));
out('+1 week:    ' + dateAdd(d, 'week', 1));
out('+1 day:     ' + dateAdd(d, 'day', 1));
out('+1 hour:    ' + dateAdd(d, 'hour', 1));
out('+1 minute:  ' + dateAdd(d, 'minute', 1));
out('+1 second:  ' + dateAdd(d, 'second', 1));
out('-1 year:    ' + dateAdd(d, 'YEAR', -1));
out('----------------');
out('----------------');
d = new Date('2016-05-31 12:00:00');
out('start:      ' + d);
out('----------------');
out('-1 year:    ' + dateAdd(d, 'YEAR', -1));
out('-1 quarter: ' +...