Incrementando uma data em JavaScript


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

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

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

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

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)

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 .


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.


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

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)


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

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

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

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)


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

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);
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.