Como determinar daqui a um ano em Javascript

111

Estou tentando chegar um ano a partir de agora, e não está funcionando.

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());

Resultado:

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)

O ano tem Dec 22 112- ?? O mês está sendo exibido corretamente Jan 22 2012.

Se quiser mexer nele, http://jsbin.com/alezaj/edit#javascript,html,live . Isso está no Chrome e no Firefox.

Obrigado!

Ian Davis
fonte

Respostas:

88

Você deve usar em getFullYear()vez de getYear(). getYear()retorna o ano real menos 1900 (e, portanto, é bastante inútil).

Assim, uma data marcando exatamente um ano a partir do momento presente seria:

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

Observe que a data será ajustada se você fizer isso em 29 de fevereiro.

Da mesma forma, você pode obter uma data daqui a um mês via getMonth()e setMonth(). Você não precisa se preocupar em "rolar" do ano atual para o ano seguinte se fizer isso em dezembro; a data será ajustada automaticamente. O mesmo vale para o dia do mês via getDate()e setDate().

Pontudo
fonte
1
Para quem está se perguntando como ele lida com anos bissextos, fiz isso em um console do Firefox ... >> 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
29
Não é hilário? Para obter uma data daqui a um ano em javascript, é necessário escrever: new Date(new Date().setFullYear(new Date().getFullYear() + 1))
LucasM
205

Isso criará Dateexatamente um ano no futuro com apenas uma linha. Primeiro obtemos o fullYearde a new Date, incrementa-o e define-o como o ano de a new Date. Você pode pensar que terminaríamos aí, mas se parássemos, ele retornaria um carimbo de data / hora, não um Dateobjeto, então envolvemos tudo em um Dateconstrutor.

new Date(new Date().setFullYear(new Date().getFullYear() + 1))
JP DeVries
fonte
13
setYear()está obsoleto , setFullYear()deve ser usado em seu lugar.
tsauerwein
1
Um liner sem variáveis ​​intermediárias para alocar! Excelente!
theUtherSide
1
isso não
lidará
32

Como setYear()está obsoleto, a variante correta é:

// 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)

Todos os exemplos retornam o carimbo de data / hora Unix, se você deseja obter o Dateobjeto - apenas envolva-o com outronew Date(...)

pliashkou
fonte
6

Usando algumas das respostas nesta página e aqui , eu vim com minha própria resposta, pois nenhuma dessas respostas resolveu totalmente para mim.

Aqui está o ponto crucial disso

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

E aqui um JSFiddle que tem um exemplo de trabalho: https://jsfiddle.net/wavesailor/g9a6qqq5/

Wavesailor
fonte
1
para que serve expireDate.getDate () - 1?
Uzer
5

Usa isto:

var startDate = new Date();
    startDate.setFullYear(startDate.getFullYear() - 1);
Abdus Salam Azad
fonte
1

Use setFullyear como outros postaram, mas esteja ciente de que isso retorna um valor de carimbo de data / hora, não um objeto de data. Também é um bom candidato para adicionar funcionalidade por meio do protótipo. Isso nos leva ao seguinte padrão:

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
fonte
0

De maneira muito simples. use este código.

// 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);" />
Nadeem Haidar
fonte
1
Por que diabos JQuery está mostrando sua cabeça feia aqui? JQuery! = JS
Uzer