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: ' +...