Jak mogę dodać 1 dzień do aktualnej daty?


93

Mam bieżący obiekt Date, który należy zwiększyć o jeden dzień za pomocą obiektu JavaScript Date. Mam następujący kod:

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

Jak mogę dodać do tego jeden dzień?

Dodałem +1 do getUTCDay()i getUTCDate()nie wyświetla „niedzieli”, dla dayktórej spodziewam się, że nastąpi.


1
Co masz na myśli, mówiąc „dodaj +1”? Potrzebujesz następnego dnia czy czegoś innego?
Aleks G

Nie date: (date.getUTCDate()+1)działa (działa dla mnie)? Możliwe, że występuje konflikt nazw z date(jako Date () - Obiekt i jako Klucz obiektu. Czy próbowałeś wywołać Date () - Obiekt inaczej?
Dominik Schreiber

obecnie pojawia się tylko jako: <option value = "2012-04-06"> sob 6 kwietnia 2012 </option> <option value = "2012-04-07"> 7 kwietnia 2012 </option>, nie "niedziela 7 kwietnia 2012 ”
franticfrantic

Więc to nie jest to, 7 Aprczego potrzebujesz (co oznacza do mnie `` dodaj następny dzień ''), to jest plik Sunday. Pamiętaj, aby dodać +1oba in day:i date:(lub, jak wspomina obecna odpowiedź, przed).
Dominik Schreiber

Odpowiedzi:


237

Aby dodać jeden dzień do obiektu daty:

var date = new Date();

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

Zobacz zduplikowane pytanie: stackoverflow.com/questions/3674539/… . Ta odpowiedź jest dobra, ale nie uwzględnia czasu letniego. Są 2 dni w roku, które nie mają 24 godzin.
Jess,

2
@ Jess - zależy to od tego, jak chcesz przedstawić zmiany w czasie letnim. Pytanie, jak dodać jeden do daty, dokładnie to robi powyższa odpowiedź. Dodanie 24 godzin niekoniecznie zwiększa tę datę, dodanie jednej do lokalnej daty za pomocą setDate zawsze tak robi.
RobG,

Oto co mam na myśli. Przyrost 10 marca: var a = new Date("2013-03-10T00:00:00.000Z"); a.setDate(a.getDate() + 1); a.toISOString();jest "2013-03-10T23:00:00.000Z". To subtelny przypadek, w którym powyższa funkcja nie zadziałała.
Jess,

1
Oczywiście nie! Rozpoczynasz od czasu UTC, a następnie zasadniczo konwertujesz go na lokalny, dodajesz dzień, a następnie konwertujesz z powrotem na UTC. Tak więc jeden dzień został dodany do lokalnej daty, ale tylko 23 godziny czasu UTC. Jeśli dodasz 1 do daty UTC, otrzymasz 01:00:00 czasu lokalnego. To zachowanie nie jest unikalne dla czasu letniego, jest konsekwencją korzystania z trzech różnych stref czasowych.
RobG,

8
Aha. Nie zdawałem sobie sprawy, że getDate konwertuje z UTC na czas lokalny. a.setUTCDate(a.getUTCDate() + 1);<- to działa z datami Zulu.
Jess,

40

Moim skromnym zdaniem najlepszym sposobem jest po prostu dodanie pełnego dnia w milisekundach, w zależności od tego, jak rozliczysz swój kod, może on zepsuć się, jeśli Twój ostatni dzień miesiąca.

na przykład 28 lutego lub 31 marca.

Oto przykład, jak bym to zrobił:

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

imo to zapewnia dokładność

oto kolejny przykład Nie podoba mi się, że może działać dla Ciebie, ale nie tak czyste, że dawka powyżej

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

imho this === 'POOP'

Niektórzy z was mieli więc narzekania na temat mojego milisekundowego podejścia ze względu na czas oszczędzania światła dziennego. Więc zamierzam to zepsuć. Po pierwsze, w niektórych krajach i stanach czas letni nie jest dostępny. Po drugie Dodanie dokładnie 24 godzin to cały dzień. Jeśli data nie zmieni się raz w roku, ale zostanie naprawiona 6 miesięcy później, nie widzę problemu. Ale aby być zdecydowanym i mieć do czynienia z przydzieleniem złej daty (), przemyślałem to i teraz całkowicie nienawidzę Date. Więc to jest moje nowe podejście

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 

A teraz zabawa!

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

teraz mamy nasz oficjalny ważny międzynarodowy obiekt daty wyraźnie zapisany na południku Zulu. Teraz, aby zmienić datę

  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.

Dodanie sekund / milisekund nie zadziała w przypadku czasu letniego.
Matt H

@Matt H, skąd wziął się ten pomysł. Czas jest ustawiony w UTC w milisekundach od 1970/01/01
Peter the Russian

1
Będzie to następny dzień czasu UTC, ale niekoniecznie czasu lokalnego. W dniu wiosennym w USA dzień ma 25 godzin. Więc jeśli masz np. 3/31/15 o godzinie 00:00 i dodasz 86400000 milisekund, w dniu sprintu do przodu, lokalny czas będzie wynosić 31.03.15 o godzinie 23:00, ponieważ w tym dniu jest 25 godzin.
Matt H

3
efekt można zobaczyć w ten sposób:var dte = Date.parse('2015-11-01'); console.log(dte); dte.setTime(dte.getTime() + 86400000 ); console.log(dte);
Matt H

1
To jest przesadzone. Jeśli masz taki problem, skorzystaj z biblioteki, takiej jak moment lub coś innego, aby ułatwić sprawę.
Joshua Michael Wagoner

11

Jeśli chcesz dodać dzień (24 godziny) do bieżącej daty i godziny, możesz dodać milisekundy w następujący sposób:

new Date(Date.now() + ( 3600 * 1000 * 24))

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


Dodanie jednego dnia milisekund kończy się niepowodzeniem, ponieważ nie wszystkie dni trwają 24 godziny w miejscach, w których obowiązuje czas letni. Np. Chile kończy czas letni o północy na początku 14 maja 2017 r. Zegary cofają się od północy do 23:00. Zatem dodanie 24 godzin do 2017-05-13 00:00:00 spowoduje powstanie 2017-05-13 23:00:00, a data się nie zmieni (niektóre przeglądarki zrobią to dokładnie o północy, inne jedną milisekundę po) . :-(
RobG

2

Zainspirowany jpmottinem w tym pytaniu , oto jeden kod liniowy:

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

Mam nadzieję że to pomoże


-3
currentDay = '2019-12-06';
currentDay = new Date(currentDay).add(Date.DAY, +1).format('Y-m-d');

Co to jest? Czy korzystasz z biblioteki?
remborg
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.