190

I'm trying to get one year from now's date, and it's not working.

JS:

var now = new Date();

var oneYr = new Date();
oneYr.setYear(now.getYear() + 1);
$("#yearFromNow").append(oneYr.toString());

var oneMonth = new Date();
oneMonth.setMonth(now.getMonth() + 1);
$("#monthFromNow").append(oneMonth.toString());

Output:

one mo. = Thu Dec 22 112 15:16:01 GMT-0500 (Eastern Standard Time)

one yr. = Sun Jan 22 2012 15:16:01 GMT-0500 (Eastern Standard Time)

The year has Dec 22 112 - ?? The month is correctly displaying Jan 22 2012.

If you want to tinker with it, http://jsbin.com/alezaj/edit#javascript,html,live. This is in Chrome and Firefox.

Thanks!

Ian Davis
  • 19,091
  • 30
  • 85
  • 133

7 Answers7

286

This will create a Date exactly one year in the future with just one line. First we get the fullYear from a new Date, increment it, set that as the year of a new Date. You might think we'd be done there, but if we stopped it would return a timestamp, not a Date object so we wrap the whole thing in a Date constructor.

new Date(new Date().setFullYear(new Date().getFullYear() + 1))
chamini2
  • 2,820
  • 2
  • 24
  • 37
JP DeVries
  • 3,917
  • 2
  • 12
  • 5
  • 15
    `setYear()` is [deprecated](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setYear), `setFullYear()` should be used instead. – tsauerwein Dec 22 '15 at 16:48
  • 1
    One liner with no intermediate variables to allocate! Excellent! – theUtherSide Aug 13 '19 at 02:47
  • 1
    this will not handle the hours, mins and seconds, it will be set to current time – some_groceries Sep 03 '19 at 12:08
  • If you call this exactly at the end/begin of the year, different calls of new Date() can return different years, increasing by (almost) two years or none!? – Wyrzutek Nov 29 '22 at 22:42
175

You should use getFullYear() instead of getYear(). getYear() returns the actual year minus 1900 (and so is fairly useless).

Thus a date marking exactly one year from the present moment would be:

var oneYearFromNow = new Date();
oneYearFromNow.setFullYear(oneYearFromNow.getFullYear() + 1);

Note that the date will be adjusted if you do that on February 29.

Similarly, you can get a date that's a month from now via getMonth() and setMonth(). You don't have to worry about "rolling over" from the current year into the next year if you do it in December; the date will be adjusted automatically. Same goes for day-of-month via getDate() and setDate().

Pointy
  • 405,095
  • 59
  • 585
  • 614
  • 1
    For anyone wondering how it deals with leap years, I did this in a Firefox console ... >> x = new Date('2000-02-29') -> Date 2000-02-29T00:00:00.000Z >> x.setYear(2001) -> 983404800000 >> x.toLocaleFormat('%d-%b-%Y') -> "01-Mar-2001" – Ivan Jan 28 '16 at 13:03
  • 43
    Isn't this hilarious? To get a date one year from now in javascript one needs to write: `new Date(new Date().setFullYear(new Date().getFullYear() + 1))` – LucasM Apr 14 '17 at 13:36
40

As setYear() is deprecated, correct variant is:

// plus 1 year
new Date().setFullYear(new Date().getFullYear() + 1)
// plus 1 month
new Date().setMonth(new Date().getMonth() + 1)
// plus 1 day
new Date().setDate(new Date().getDate() + 1)

All examples return Unix timestamp, if you want to get Date object - just wrap it with another new Date(...)

pliashkou
  • 4,052
  • 2
  • 31
  • 39
8

Use this:

var startDate = new Date();
    startDate.setFullYear(startDate.getFullYear() - 1);
Abdus Salam Azad
  • 5,087
  • 46
  • 35
7

Using some of the answers on this page and here, I came up with my own answer as none of these answers fully solved it for me.

Here is crux of it

var startDate = "27 Apr 2017";
var numOfYears = 1;
var expireDate = new Date(startDate);
expireDate.setFullYear(expireDate.getFullYear() + numOfYears);
expireDate.setDate(expireDate.getDate() -1);

And here a a JSFiddle that has a working example: https://jsfiddle.net/wavesailor/g9a6qqq5/

Community
  • 1
  • 1
Wavesailor
  • 662
  • 10
  • 19
2

Use setFullyear as others have posted but be aware this returns a timestamp value not a date object. It is also a good candidate imho to add functionality via the prototype. This leads us to the following pattern:

Date.prototype.addYears = function(n) {
    var now = new Date();
    return new Date(now.setFullYear(now.getFullYear() + n));
};

console.log('Year from now is', new Date().addYears(1));
James Westgate
  • 11,306
  • 8
  • 61
  • 68
0

In very simple way. use this code.

// define function 
function nextYearDate(date1) {
    var date2 = new Date(date1);
    var date3 = date2.setDate(date2.getDate() - 1);
    var date = new Date(date3);
    var day = date.getDate();
    var month = date.getMonth()+1;
    var year = date.getFullYear()+1;
    var newdate = year + '-' + (month < 10 ? '0' : '') + month + '-' + (day < 10 ? '0' : '') + day;
    $("#next_date").val(newdate);
}
// call function.
<input type="date" name="current_date" id="current_date" value="" onblur="nextYearDate(this.value);" />

<input type="date" name="next_date" id="next_date" value="" onblur="nextYearDate(this.value);" />