Incrementando uma data em JavaScript

433

Preciso incrementar um valor de data em um dia em JavaScript.

Por exemplo, tenho um valor de data 11/09/2010 e preciso armazenar a data do dia seguinte em uma variável JavaScript.

Como posso incrementar uma data por dia?

Santanu
fonte
Isso responde sua pergunta? Adicionar dias à data do JavaScript
Michael Freidgeim 03/06

Respostas:

791

Três opções para você:

1. Usando apenas o Dateobjeto JavaScript (sem bibliotecas):

Minha resposta anterior para o número 1 estava errada (foram adicionadas 24 horas, falhando em levar em consideração as transições para o horário de verão; o Clever Human salientou que falharia com 7 de novembro de 2010 no fuso horário do leste). Em vez disso, a resposta de Jigar é a maneira correta de fazer isso sem uma biblioteca:

var tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);

Isso funciona mesmo no último dia do mês (ou ano), porque o objeto de data do JavaScript é inteligente sobre a rolagem:

(No momento, essa resposta é aceita, então não posso excluí-la. Antes de ser aceita, sugeri ao OP que aceitassem o Jigar, mas talvez tenham aceitado essa para os itens 2 ou 3 da lista.)

2. Usando MomentJS :

var today = moment();
var tomorrow = moment(today).add(1, 'days');

(Cuidado que addmodifica a instância em que você a invoca, em vez de retornar uma nova instância, a today.add(1, 'days')modificação seria today. É por isso que começamos com uma operação de clonagem var tomorrow = ....)

3. Usando o DateJS , mas ele não é atualizado há muito tempo:

var today = new Date(); // Or Date.today()
var tomorrow = today.add(1).day();
TJ Crowder
fonte
. Mas eu tenho data 2010-09-11 em uma variável usando document.getElementById ( "ARRIVAL_DATE") valor, ele mostra a data inválida
Santanu
1
@santanu: Esse é um problema completamente diferente: Análise de data (obter uma data interpretando uma string). Se esse formato for estático, você poderá analisá-lo e alimentar os resultados no Dateconstrutor ( new Date(year, month, date)); consulte a seção 15.9.2.1 da especificação ; Se você deseja aceitar uma variedade de formatos, definitivamente dê uma olhada no DateJS .
TJ Crowder
1
@santanu: Apenas para seguir o exemplo acima: Alguns navegadores podem analisar com êxito esse formato Date.parse(o que retorna um número de milissegundos que você pode alimentar new Date(ms)). Mas cuidado, isso pode variar de navegador para navegador. Até recentemente, as implementações podiam fazer praticamente qualquer coisa que desejassem Date.parse. A nova especificação da 5ª edição agora tem um formato mínimo que deve ser aceito, mas eu ainda não contaria com isso.
TJ Crowder
Eu só queria adicionar um segundo a uma instância do Date; isso funcionou para mim x = new Date(); x2 = new Date(x.getTime() + 1000), onde 1000 é um incremento de milissegundos.
berto
1
@piavgh: Não há nada errado com a primeira solução, é exatamente como você a está usando. Dateobjetos são mutáveis. Você está armazenando o mesmo Date objeto três vezes na matriz. Se você quiser três Dateobjetos diferentes , precisará criar três objetos:var unavailableDates = []; for (var d = new Date('2017-05-11'); d < new Date('2017-05-13'); d.setDate(d.getDate() + 1)) { unavailableDates.push(new Date(+d)); }
TJ Crowder
178
var myDate = new Date();

//add a day to the date
myDate.setDate(myDate.getDate() + 1);
Jigar Joshi
fonte
. Mas eu tenho data 2010-09-11 em uma variável usando document.getElementById ( "ARRIVAL_DATE") valor, ele mostra a data inválida
Santanu
1
@ Sanatu: Nesse caso, você precisa formatar a string de uma maneira que o navegador aceite. O Chrome aceita, new Date("2009-09-11")mas o Firefox não. Eu acho que a maioria dos navegadores aceita, new Date("2009/09/11")então uma solução fácil seria var arrivalDate = document.getElementById('arival_date').value; var dayAfter = new Date(arrival_date.replace(/-/g, '/')); dayAfter.setDate(dayAfter.getDate()+1);.
David Hedlund
5
Uma abordagem mais sólida do que substituir -com /e esperando que os navegadores irá aceitá-lo, seria dividir a string em partes: var dateParts = arrivalDate.split('-'); var y = parseInt(dateParts[0], 10); var m = parseInt(dateParts[1], 10); var d = parseInt(dateParts[2], 10); var dayAfter = new Date(y, m-1, d+1);Note que estamos usando m-1aqui, porque meses JavaScript são valores enum (janeiro de ser 0, não 1), e d+1porque nós 'estão fazendo a incrementação já na tarefa inicial (que vai corrigir automaticamente para 29 de fevereiro, etc.)
David Hedlund
35

Nenhum dos exemplos nesta resposta parece funcionar com os dias de ajuste do horário de verão. Naqueles dias, o número de horas em um dia não é 24 (são 23 ou 25, dependendo se você está "avançando" ou "recuando").

A função javascript AddDays abaixo é responsável pelo horário de verão:

function addDays(date, amount) {
  var tzOff = date.getTimezoneOffset() * 60 * 1000,
      t = date.getTime(),
      d = new Date(),
      tzOff2;

  t += (1000 * 60 * 60 * 24) * amount;
  d.setTime(t);

  tzOff2 = d.getTimezoneOffset() * 60 * 1000;
  if (tzOff != tzOff2) {
    var diff = tzOff2 - tzOff;
    t += diff;
    d.setTime(t);
  }

  return d;
}

Aqui estão os testes que eu usei para testar a função:

    var d = new Date(2010,10,7);
    var d2 = AddDays(d, 1);
    document.write(d.toString() + "<br />" + d2.toString());

    d = new Date(2010,10,8);
    d2 = AddDays(d, -1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

    d = new Date('Sun Mar 27 2011 01:59:00 GMT+0100 (CET)');
    d2 = AddDays(d, 1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

    d = new Date('Sun Mar 28 2011 01:59:00 GMT+0100 (CET)');
    d2 = AddDays(d, -1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());
CleverPatrick
fonte
33

A maneira mais fácil é converter para milissegundos e adicionar 1000 * 60 * 60 * 24 milissegundos, por exemplo:

var tomorrow = new Date(today.getTime()+1000*60*60*24);
Sylvain Lecorné
fonte
Eu amo essa regra de representação inteira.
exebook
Esta é a melhor resposta. Pode aumentar / diminuir facilmente quantos dias forem solicitados; apenas multiplicando 1000*60*60*24xDaysToBeAdded
Khalil Khalaf
Ou,, new Date(+new Date() + 1000*60*60*24)mas na verdade é semelhante a getTime()/ setTime(), realmente.
Polv 07/01
1
Não faça isso a menos que sua data esteja no UTC ou em outro fuso horário que não tenha horário de verão. Caso contrário, por 2 dias por ano, ele fornecerá resultados inesperados.
ItalyPaleAle 28/03
A one-liner:new Date(Date.now()+1000*60*60*24);
aiyan 13/04
28

Amanhã em uma linha em JS puro, mas é feio !

new Date(new Date().setDate(new Date().getDate() + 1))

Aqui está o resultado:

Thu Oct 12 2017 08:53:30 GMT+0200 (Romance Summer Time)
jpmottin
fonte
14

Você primeiro precisa analisar sua string antes de seguir a sugestão de outras pessoas:

var dateString = "2010-09-11";
var myDate = new Date(dateString);

//add a day to the date
myDate.setDate(myDate.getDate() + 1);

Se você deseja voltar no mesmo formato novamente, precisará fazer isso "manualmente":

var y = myDate.getFullYear(),
    m = myDate.getMonth() + 1, // january is month 0 in javascript
    d = myDate.getDate();
var pad = function(val) { var str = val.toString(); return (str.length < 2) ? "0" + str : str};
dateString = [y, pad(m), pad(d)].join("-");

Mas sugiro que você obtenha o Date.js, como mencionado em outras respostas, que o ajudará muito .

einarmagnus
fonte
7

Eu sinto que nada é mais seguro do que .getTime()e .setTime(), portanto, esse deve ser o melhor e o desempenho também.

const d = new Date()
console.log(d.setTime(d.getTime() + 1000 * 60 * 60 * 24)) // MILLISECONDS

.setDate() para Data inválida (como 31 + 1) é muito perigoso e depende da implementação do navegador.

Polv
fonte
5

Nos próximos 5 dias:

var date = new Date(),
d = date.getDate(),
m = date.getMonth(),
y = date.getFullYear();


for(i=0; i < 5; i++){
var curdate = new Date(y, m, d+i)
console.log(curdate)
}
fitodac
fonte
Tentei as respostas acima, mas em vão. Seu código funcionou como um encanto. Obrigado!
precisa saber é o seguinte
4

Dois métodos:

1:

var a = new Date()
// no_of_days is an integer value
var b = new Date(a.setTime(a.getTime() + no_of_days * 86400000)

2: Semelhante ao método anterior

var a = new Date()
// no_of_days is an integer value
var b = new Date(a.setDate(a.getDate() + no_of_days)
Laksh Goel
fonte
2

Obtenha o valor da string da data usando o método dateObj.toJSON (). Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON Fatie a data do retorno valor e, em seguida, incremente pelo número de dias que você deseja.

var currentdate = new Date();
currentdate.setDate(currentdate.getDate() + 1);
var tomorrow = currentdate.toJSON().slice(0,10);
phil
fonte
Date.toJSON usa o fuso horário UTC stackoverflow.com/questions/11382606/…
AndreyP:
2
 Date.prototype.AddDays = function (days) {
    days = parseInt(days, 10);
    return new Date(this.valueOf() + 1000 * 60 * 60 * 24 * days);
}

Exemplo

var dt = new Date();
console.log(dt.AddDays(-30));
console.log(dt.AddDays(-10));
console.log(dt.AddDays(-1));
console.log(dt.AddDays(0));
console.log(dt.AddDays(1));
console.log(dt.AddDays(10));
console.log(dt.AddDays(30));

Resultado

2017-09-03T15:01:37.213Z
2017-09-23T15:01:37.213Z
2017-10-02T15:01:37.213Z
2017-10-03T15:01:37.213Z
2017-10-04T15:01:37.213Z
2017-10-13T15:01:37.213Z
2017-11-02T15:01:37.213Z
swirekx
fonte
Seu código não funciona. Eu tentei com o primeiro console.log () e diz: dt.AddDays () não é uma função.
Adrian2895 20/05/19
1

Não tenho certeza absoluta se é um BUG (Firefox testado 32.0.3 e Chrome 38.0.2125.101), mas o código a seguir falhará no Brasil (-3 GMT):

Date.prototype.shiftDays = function(days){    
  days = parseInt(days, 10);
  this.setDate(this.getDate() + days);
  return this;
}

$date = new Date(2014, 9, 16,0,1,1);
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");

Resultado:

Fri Oct 17 2014 00:01:01 GMT-0300
Sat Oct 18 2014 00:01:01 GMT-0300
Sat Oct 18 2014 23:01:01 GMT-0300
Sun Oct 19 2014 23:01:01 GMT-0200

Adicionar uma hora à data fará com que funcione perfeitamente (mas não resolve o problema).

$date = new Date(2014, 9, 16,0,1,1);

Resultado:

Fri Oct 17 2014 01:01:01 GMT-0300
Sat Oct 18 2014 01:01:01 GMT-0300
Sun Oct 19 2014 01:01:01 GMT-0200
Mon Oct 20 2014 01:01:01 GMT-0200
Alan Weiss
fonte
1

Resultados em uma representação de seqüência de caracteres da data de amanhã. Use new Date () para obter a data de hoje, adicionando um dia usando Date.getDate () e Date.setDate () e convertendo o objeto Date em uma string.

  const tomorrow = () => {
      let t = new Date();
      t.setDate(t.getDate() + 1);
      return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(
        t.getDate()
      ).padStart(2, '0')}`;
    };
    tomorrow();
Gor
fonte
1

Incrementando o ano da data com vanilla js:

start_date_value = "01/01/2019"
var next_year = new Date(start_date_value);
next_year.setYear(next_year.getYear() + 1);
console.log(next_year.getYear()); //=> 2020

Apenas no caso de alguém querer incrementar outro valor além da data (dia)

d1jhoni1b
fonte
1

Via JS nativo, para adicionar um dia, você pode fazer o seguinte:

let date = new Date(); // today
date.setDate(date.getDate() + 1) // tomorrow

Outra opção é usar a momentbiblioteca:

const date = moment().add(14, "days").toDate()
Kiran Debnath
fonte
1
Por favor, explique o que esse código faz. Adicione detalhes sobre como ele resolve o problema do OP.
Yash
1

Incremento de data com reconhecimento de fuso horário / horário de verão para datas JavaScript:

function nextDay(date) {
    const sign = v => (v < 0 ? -1 : +1);
    const result = new Date(date.getTime());
    result.setDate(result.getDate() + 1);
    const offset = result.getTimezoneOffset();
    return new Date(result.getTime() + sign(offset) * offset * 60 * 1000);
}
Peter Marklund
fonte