Como posso adicionar 1 dia à data atual?

96

Eu tenho um objeto Date atual que precisa ser incrementado em um dia usando o objeto Date JavaScript. Eu tenho o seguinte código em vigor:

var ds = stringFormat("{day} {date} {month} {year}", { 
                day: companyname.i18n.translate("day", language)[date.getUTCDay()], 
                date: date.getUTCDate(), 
                month: companyname.i18n.translate("month", language)[date.getUTCMonth()], 
                year: date.getUTCFullYear() 
});

Como posso adicionar um dia a isso?

Adicionei +1 a getUTCDay()e, getUTCDate()mas ele não exibe 'Domingo' para day, o que estou esperando que aconteça.

frenético-frenético
fonte
1
O que você quer dizer com "adicionar +1"? Você precisa do dia seguinte ou de outra coisa?
Aleks G
Não date: (date.getUTCDate()+1)funciona (funciona para mim)? É possível que haja um conflito de nomenclatura com date(as Date () - Object e as Object-Key. Você tentou chamar Date () - Object diferente?
Dominik Schreiber
atualmente, ele aparece apenas como: <option value = "2012-04-06"> Sáb, 6 de abril de 2012 </option> <option value = "2012-04-07"> 7 de abril de 2012 </option>, não "Domingo 7 de abril de 2012 "
franticfrantic
Portanto, não é o que 7 Aprvocê precisa (o que é 'adicionar no dia seguinte' para mim), é o Sunday. Lembre-se de adicionar +1tanto em day:e date:(ou, como a resposta atual menciona, antes).
Dominik Schreiber,

Respostas:

251

Para adicionar um dia a um objeto de data:

var date = new Date();

// add a day
date.setDate(date.getDate() + 1);
RobG
fonte
Veja a pergunta duplicada: stackoverflow.com/questions/3674539/… . Essa resposta é boa, mas não leva em conta o DST. Existem 2 dias do ano que não têm 24 horas.
Jess
2
@ Jess — depende de como você deseja que as alterações sobre o DST sejam representadas. A pergunta feita como adicionar um à data, é exatamente o que a resposta acima faz. Adicionar 24 horas não incrementa necessariamente essa data, adicionar um à data local usando setDate sempre faz.
RobG
Aqui está o que quero dizer. Incrementando 10 de março: var a = new Date("2013-03-10T00:00:00.000Z"); a.setDate(a.getDate() + 1); a.toISOString();é "2013-03-10T23:00:00.000Z". Este é um caso sutil em que a função acima não funcionou para mim.
Jess
1
Claro que não! Você começa com uma hora UTC e, em seguida, essencialmente a converte para local, adiciona um dia e, em seguida, converte de volta para UTC. Portanto, um dia foi adicionado à data local , mas apenas 23 horas no horário UTC. Se você adicionar 1 à data UTC, receberá 01:00:00 hora local. Esse comportamento não é exclusivo do horário de verão, é uma consequência do uso de três fusos horários diferentes.
RobG
8
Aha. Não percebi que getDate estava convertendo do UTC para o horário local. a.setUTCDate(a.getUTCDate() + 1);<- isso funciona com datas Zulu.
Jess
41

Na minha humilde opinião, a melhor maneira é apenas adicionar um dia inteiro em milissegundos, dependendo de como você fatora seu código, isso pode bagunçar se for no último dia do mês.

por exemplo, 28 de fevereiro ou 31 de março.

Aqui está um exemplo de como eu faria isso:

var current = new Date(); //'Mar 11 2015' current.getTime() = 1426060964567
var followingDay = new Date(current.getTime() + 86400000); // + 1 day in ms
followingDay.toLocaleDateString();

imo, isso garante precisão

aqui está outro exemplo que eu não gosto pode funcionar para você, mas não tão limpo aquela dose acima

var today = new Date('12/31/2015');
var tomorrow = new Date(today);
tomorrow.setDate(today.getDate()+1);
tomorrow.toLocaleDateString();

imho this === 'POOP'

Alguns de vocês reclamaram da minha abordagem do milissegundo por causa do horário de verão. Então eu vou quebrar isso. Primeiro, alguns países e estados não têm horário de verão. Segundo Adicionar exatamente 24 horas é um dia inteiro. Se o número da data não mudar uma vez por ano, mas for corrigido 6 meses depois, não vejo problema nisso. Mas, com o propósito de ser definitivo e ter que lidar com a distribuição do maligno Date (), pensei muito sobre isso e agora odeio completamente o Date. Portanto, esta é a minha nova abordagem

var dd = new Date(); // or any date and time you care about 
var dateArray =  dd.toISOString().split('T')[0].split('-').concat( dd.toISOString().split('T')[1].split(':') );
// ["2016", "07", "04", "00", "17", "58.849Z"] at Z 

Agora a parte divertida!

var date = { 
    day: dateArray[2],
    month: dateArray[1],
    year: dateArray[0],
    hour: dateArray[3],
    minutes: dateArray[4],
    seconds:dateArray[5].split('.')[0],
    milliseconds: dateArray[5].split('.')[1].replace('Z','')
}

agora temos nosso Objeto de Data Internacional Válido Oficial claramente escrito no meridiano Zulu. Agora para mudar a data

  dd.setDate(dd.getDate()+1); // this gives you one full calendar date forward
  tomorrow.setDate(dd.getTime() + 86400000);// this gives your 24 hours into the future. do what you want with it.
Pedro o Russo
fonte
Adicionar segundos / milissegundos não funcionará para o horário de verão.
Matt H
@Matt H de onde você tirou essa ideia. A hora é acertada em UTC em milissegundos a partir de 01/01/1970
Pedro, o Russo
2
Será no dia seguinte no horário UTC, sim, mas não necessariamente no horário local. No dia Spring Forward nos EUA, o dia tem 25 horas. Portanto, se você tiver, por exemplo, 31/03/15 às 00:00 horas e adicionar 86400000 milissegundos, no dia de Sprint Forward, a hora local será 31/03/15 às 23:00 horas, já que há 25 horas naquele dia.
Matt H
3
você pode ver o efeito assim:var dte = Date.parse('2015-11-01'); console.log(dte); dte.setTime(dte.getTime() + 86400000 ); console.log(dte);
Matt H
1
Isso é over-engineering. Se você está tendo um problema como este, use uma biblioteca como o momento ou algo para ajudar a tornar as coisas mais fáceis.
Joshua Michael Wagoner
13

Se você deseja adicionar um dia (24 horas) à data e hora atual, você pode adicionar milissegundos como este:

new Date(Date.now() + ( 3600 * 1000 * 24))
Pablo Andres Diaz Mazzaro
fonte
9
int days = 1;
var newDate = new Date(Date.now() + days*24*60*60*1000);

CodePen

var days = 2;
var newDate = new Date(Date.now()+days*24*60*60*1000);

document.write('Today: <em>');
document.write(new Date());
document.write('</em><br/> New: <strong>');
document.write(newDate);

Sarja
fonte
Adicionar um dia de milissegundos falha porque nem todos os dias duram 24 horas em locais que observam o horário de verão. Por exemplo, o Chile termina o horário de verão à meia-noite no início de 14 de maio de 2017. Os relógios retrocederão da meia-noite às 23:00. Portanto, adicionar 24 horas a 13-05-2017 00:00:00 resultará em 13-05-2017 23:00:00 e a data não muda (alguns navegadores farão isso exatamente à meia-noite, outros um milissegundo depois) . :-(
RobG
2

Inspirado por jpmottin em esta pergunta , aqui está o código uma linha:

var dateStr = '2019-01-01';
var days = 1;

var result = new Date(new Date(dateStr).setDate(new Date(dateStr).getDate() + days));

document.write('Date: ', result); // Wed Jan 02 2019 09:00:00 GMT+0900 (Japan Standard Time)
document.write('<br />');
document.write('Trimmed Date: ', result.toISOString().substr(0, 10)); // 2019-01-02

Espero que isto ajude

Jee Mok
fonte
-3
currentDay = '2019-12-06';
currentDay = new Date(currentDay).add(Date.DAY, +1).format('Y-m-d');
Paul Wolbers
fonte
O que é isso? Você está usando uma biblioteca?
remborg de