Zwiększanie daty w JavaScript

433

Muszę zwiększyć wartość daty o jeden dzień w JavaScript.

Na przykład mam wartość daty 2010-09-11 i muszę przechowywać datę następnego dnia w zmiennej JavaScript.

Jak mogę zwiększyć datę o jeden dzień?

Santanu
źródło
Czy to odpowiada na twoje pytanie? Dodaj dni do JavaScript Data
Michael Freidgeim

Odpowiedzi:

791

Trzy opcje dla Ciebie:

1. Używając tylko Dateobiektu JavaScript (bez bibliotek):

Moja poprzednia odpowiedź na nr 1 była błędna (dodała 24 godziny, nie biorąc pod uwagę przejścia na czas letni i zimowy; Clever Human zwrócił uwagę, że zakończy się niepowodzeniem z 7 listopada 2010 r. We wschodniej strefie czasowej). Zamiast tego odpowiedź Jigara to właściwy sposób na zrobienie tego bez biblioteki:

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

Działa to nawet w ostatnim dniu miesiąca (lub roku), ponieważ obiekt daty JavaScript ma sprytne podejście do najazdu:

(Ta odpowiedź jest obecnie akceptowana, więc nie mogę jej usunąć. Zanim została zaakceptowana, zasugerowałem PO, że akceptują odpowiedź Jigara, ale być może zaakceptowali tę odpowiedź dla pozycji 2 lub 3 na liście).

2. Korzystanie z MomentJS :

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

(Uwaga: addmodyfikuje instancję, do której ją wywołujesz, zamiast zwracać nową instancję, więc today.add(1, 'days')zmodyfikuje todayto. Dlatego zaczynamy od klonowania var tomorrow = ...).

3. Używanie DateJS , ale nie był aktualizowany od dłuższego czasu:

var today = new Date(); // Or Date.today()
var tomorrow = today.add(1).day();
TJ Crowder
źródło
Ale mam datę 2010-09-11 w zmiennej za pomocą document.getElementById („arrival_date"). Wartość, pokazuje niepoprawną datę
Santanu
1
@santanu: To zupełnie inny problem: parsowanie daty (uzyskiwanie daty poprzez interpretację ciągu znaków). Jeśli ten format jest statyczny, możesz go parsować samodzielnie i wprowadzić wyniki do Datekonstruktora ( new Date(year, month, date)); patrz sekcja 15.9.2.1 specyfikacji ; jeśli chcesz zaakceptować szereg formatów, zdecydowanie spójrz na DateJS .
TJ Crowder,
1
@santanu: Kontynuując powyższe: Niektóre przeglądarki mogą z powodzeniem parsować ten format za pomocą Date.parse(który zwraca liczbę milisekund, które możesz następnie przesłać new Date(ms)). Ale uwaga, może różnić się w zależności od przeglądarki. Do niedawna wdrożenia mogły robić wszystko, co tylko chcieli Date.parse. Nowa specyfikacja 5. edycji ma teraz minimalny format, który należy zaakceptować, ale na to jeszcze nie liczyłem.
TJ Crowder,
Chciałem tylko dodać sekundę do instancji Date; działało to dla mnie x = new Date(); x2 = new Date(x.getTime() + 1000), gdzie 1000 to przyrost milisekundowy.
berto
1
@piavgh: Nie ma nic złego w pierwszym rozwiązaniu, po prostu jak go używasz. Dateobiekty są zmienne. Trzy razy przechowujesz ten sam Date obiekt w tablicy. Jeśli chcesz trzy różne Dateobiekty, musisz utworzyć trzy obiekty: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
źródło
Ale mam datę 2010-09-11 w zmiennej za pomocą document.getElementById („arrival_date"). Wartość, pokazuje niepoprawną datę
Santanu
1
@sanatu: W takim przypadku musisz sformatować ciąg w sposób akceptowany przez przeglądarkę. Chrome akceptuje, new Date("2009-09-11")ale Firefox nie. Myślę, że większość przeglądarek akceptuje, new Date("2009/09/11")więc byłoby to łatwe rozwiązanie var arrivalDate = document.getElementById('arival_date').value; var dayAfter = new Date(arrival_date.replace(/-/g, '/')); dayAfter.setDate(dayAfter.getDate()+1);.
David Hedlund,
5
Bardziej solidnym podejściem niż zastąpienie -go /i nadzieja, że ​​przeglądarki go zaakceptują, byłoby podzielenie łańcucha na części: 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);Zauważ, że używamy m-1tutaj, ponieważ miesiące javascript są wartościami wyliczanymi (styczeń to 0, a nie 1), a d+1ponieważ wykonuję inkrementację już w początkowym zadaniu (poprawi się automatycznie na 29 lutego itd.)
David Hedlund,
35

Żaden z przykładów w tej odpowiedzi wydaje się nie działać z dniami dostosowywania czasu letniego. W tych dniach liczba godzin w ciągu dnia nie wynosi 24 (są to 23 lub 25, w zależności od tego, czy „skaczesz do przodu”, czy „cofasz się”).

Poniższa funkcja AddDays javascript uwzględnia czas letni:

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

Oto testy, których użyłem do przetestowania funkcji:

    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
źródło
33

Najprostszym sposobem jest konwersja do milisekund i dodanie 1000 * 60 * 60 * 24 milisekund, np .:

var tomorrow = new Date(today.getTime()+1000*60*60*24);
Sylvain Lecorné
źródło
Uwielbiam tę jedną, całkowitą zasadę reprezentacji.
exebook
To najlepsza odpowiedź. Może łatwo zwiększać / zmniejszać tyle dni, ile zażąda; po prostu mnożąc 1000*60*60*24xDaysToBeAdded
Khalil Khalaf
Lub, new Date(+new Date() + 1000*60*60*24)ale tak naprawdę jest podobny do getTime()/ setTime(), naprawdę.
Polv
1
Nie rób tego, chyba że masz datę w UTC lub w innej strefie czasowej, w której nie ma czasu letniego. W przeciwnym razie przez 2 dni w roku przyniesie nieoczekiwane rezultaty.
PaleAle
One-liner:new Date(Date.now()+1000*60*60*24);
aiyan
28

Jutro w jednej linii w czystym JS, ale jest brzydka !

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

Oto wynik:

Thu Oct 12 2017 08:53:30 GMT+0200 (Romance Summer Time)
jpmottin
źródło
14

Najpierw musisz przeanalizować ciąg znaków, zanim zastosujesz się do sugestii innych osób:

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

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

Jeśli chcesz ponownie w tym samym formacie, musisz to zrobić „ręcznie”:

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

Ale sugeruję zdobycie Date.js, jak wspomniano w innych odpowiedziach, które pomogą ci dużo .

einarmagnus
źródło
7

Uważam, że nic nie jest bezpieczniejsze niż .getTime()i .setTime(), więc powinno to być najlepsze i wydajne.

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

.setDate() z powodu nieprawidłowej daty (np. 31 + 1) jest zbyt niebezpieczne i zależy od implementacji przeglądarki.

Polv
źródło
5

Zdobycie kolejnych 5 dni:

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)
}
fitodak
źródło
Próbowałem powyższych odpowiedzi, ale na próżno. Twój kod działał jak urok. Dzięki!
dimmat
4

Dwie metody:

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: podobny do poprzedniej metody

var a = new Date()
// no_of_days is an integer value
var b = new Date(a.setDate(a.getDate() + no_of_days)
Laksh Goel
źródło
2

Uzyskaj wartość ciągu daty za pomocą metody dateObj.toJSON () Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON Pokrój datę ze zwróconego wartość, a następnie przyrost o żądaną liczbę dni.

var currentdate = new Date();
currentdate.setDate(currentdate.getDate() + 1);
var tomorrow = currentdate.toJSON().slice(0,10);
phil
źródło
Date.toJSON korzysta ze strefy czasowej 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);
}

Przykład

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

Wynik

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
źródło
Twój kod nie działa. Wypróbowałem to z pierwszą konsolą.log () i mówi: dt.AddDays () nie jest funkcją.
Adrian2895,
1

Nie jestem całkowicie pewien, czy jest to BŁĄD (przetestowany Firefox 32.0.3 i Chrome 38.0.2125.101), ale następujący kod nie zadziała w Brazylii (-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+"");

Wynik:

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

Dodanie jednej godziny do daty sprawi, że będzie działać idealnie (ale nie rozwiąże problemu).

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

Wynik:

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
źródło
1

Wynikiem jest ciąg reprezentujący jutrzejszą datę. Użyj new Date (), aby uzyskać dzisiejszą datę, dodając jeden dzień za pomocą Date.getDate () i Date.setDate () i przekonwertując obiekt Date na ciąg.

  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
źródło
1

Inkrementacja roku daty za pomocą waniliowej 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

Na wypadek, gdyby ktoś chciał zwiększyć wartość inną niż data (dzień)

d1jhoni1b
źródło
1

Za pośrednictwem natywnego JS, aby dodać jeden dzień, możesz wykonać następujące czynności:

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

Inną opcją jest użycie momentbiblioteki:

const date = moment().add(14, "days").toDate()
Kiran Debnath
źródło
1
Wyjaśnij, co robi ten kod. Dodaj szczegóły dotyczące tego, jak rozwiązuje problem PO.
Yash,
1

Przyrost dat świadomych stref czasowych / czasowych dla dat 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
źródło