Zwiększanie daty w JavaScript


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

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

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

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

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)

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 .


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.


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

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)


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

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

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

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


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

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