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.