JavaScript Function to Add X Months to a Date

JavaScript function to add X months to a date

The following function adds months to a date in JavaScript (source). It takes into account year roll-overs and varying month lengths:

function addMonths(date, months) {

var d = date.getDate();

date.setMonth(date.getMonth() + +months);

if (date.getDate() != d) {

date.setDate(0);

}

return date;

}

// Add 12 months to 29 Feb 2016 -> 28 Feb 2017

console.log(addMonths(new Date(2016,1,29),12).toString());

// Subtract 1 month from 1 Jan 2017 -> 1 Dec 2016

console.log(addMonths(new Date(2017,0,1),-1).toString());

// Subtract 2 months from 31 Jan 2017 -> 30 Nov 2016

console.log(addMonths(new Date(2017,0,31),-2).toString());

// Add 2 months to 31 Dec 2016 -> 28 Feb 2017

console.log(addMonths(new Date(2016,11,31),2).toString());

How to add months to a date in JavaScript?

Corrected as of 25.06.2019:

var newDate = new Date(date.setMonth(date.getMonth()+8));

Old
From here:

var jan312009 = new Date(2009, 0, 31);
var eightMonthsFromJan312009 = jan312009.setMonth(jan312009.getMonth()+8);

Adding months to a Date in JavaScript

You need to get business rules for adding months. The simple solution is:

function addMonths(dateObj, num) {
return dateObj.setMonth(dateObj.getMonth() + num);
}

However, that will change 31 July to 31 September, which will be converted to 1 October. Also, 31 January plus 1 month is 31 February which will be converted to 2 or 3 March depending on whether it's a leap year or not.

You might expect the first to be 30 September and the second to be 28 or 29 February (depending on whether it's a leap year or not).

So if you want "end of months" be observed, you need to do something like:

function addMonths(dateObj, num) {

var currentMonth = dateObj.getMonth() + dateObj.getFullYear() * 12;
dateObj.setMonth(dateObj.getMonth() + num);
var diff = dateObj.getMonth() + dateObj.getFullYear() * 12 - currentMonth;

// If don't get the right number, set date to
// last day of previous month
if (diff != num) {
dateObj.setDate(0);
}
return dateObj;
}

But check with whoever is responsible for the business rules that that is what they want.

Edit

The above works well, but in response to McShaman's comment here is a version with a simpler check for the month roll–over:

function addMonths(date, months) {

var d = date.getDate();

date.setMonth(date.getMonth() + +months);

if (date.getDate() != d) {

date.setDate(0);

}

return date;

}

// Add 12 months to 29 Feb 2016 -> 28 Feb 2017

console.log(addMonths(new Date(2016,1,29),12).toString());

// Subtract 1 month from 1 Jan 2017 -> 1 Dec 2016

console.log(addMonths(new Date(2017,0,1),-1).toString());

// Subtract 2 months from 31 Jan 2017 -> 30 Nov 2016

console.log(addMonths(new Date(2017,0,31),-2).toString());

// Add 2 months to 31 Dec 2016 -> 28 Feb 2017

console.log(addMonths(new Date(2016,11,31),2).toString());

How to properly add 1 month from now to current date in moment.js

var currentDate = moment('2015-10-30');
var futureMonth = moment(currentDate).add(1, 'M');
var futureMonthEnd = moment(futureMonth).endOf('month');

if(currentDate.date() != futureMonth.date() && futureMonth.isSame(futureMonthEnd.format('YYYY-MM-DD'))) {
futureMonth = futureMonth.add(1, 'd');
}

console.log(currentDate);
console.log(futureMonth);

DEMO

EDIT

moment.addRealMonth = function addRealMonth(d) {
var fm = moment(d).add(1, 'M');
var fmEnd = moment(fm).endOf('month');
return d.date() != fm.date() && fm.isSame(fmEnd.format('YYYY-MM-DD')) ? fm.add(1, 'd') : fm;
}

var nextMonth = moment.addRealMonth(moment());

DEMO

how do i add x number of months to current date in angular2

Use setMonth() method in javascript

export class AppComponent  {
name = 'Angular 5';
send_date=new Date();
formattedDate : any;
constructor(){
this.send_date.setMonth(this.send_date.getMonth()+8);
this.formattedDate=this.send_date.toISOString().slice(0,10);
console.log(this.formattedDate);
}

}

How do I calculate the date in JavaScript three months prior to today?

var d = new Date();
d.setMonth(d.getMonth() - 3);

This works for January. Run this snippet:

var d = new Date("January 14, 2012");

console.log(d.toLocaleDateString());

d.setMonth(d.getMonth() - 3);

console.log(d.toLocaleDateString());


Related Topics



Leave a reply



Submit