Inkrementieren eines Datums in JavaScript


Antworten:


791

Drei Optionen für Sie:

1. Verwenden Sie nur das JavaScript- DateObjekt (keine Bibliotheken):

Meine vorherige Antwort für Nummer 1 war falsch (sie fügte 24 Stunden hinzu und berücksichtigte keine Übergänge zur und von der Sommerzeit; Clever Human wies darauf hin, dass sie mit dem 7. November 2010 in der östlichen Zeitzone fehlschlagen würde). Stattdessen ist Jigars Antwort der richtige Weg, dies ohne Bibliothek zu tun:

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

Dies funktioniert sogar für den letzten Tag eines Monats (oder Jahres), da das JavaScript-Datumsobjekt beim Rollover klug ist:

(Diese Antwort wird derzeit akzeptiert, daher kann ich sie nicht löschen. Bevor sie akzeptiert wurde, schlug ich dem OP vor, Jigars zu akzeptieren, aber vielleicht haben sie diese für die Punkte 2 oder 3 auf der Liste akzeptiert.)

2. Verwenden von MomentJS :

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

(Beachten Sie, dass adddie Instanz, auf der Sie sie aufrufen , geändert wird, anstatt eine neue Instanz zurückzugeben. Dies today.add(1, 'days')würde sich ändern today. Deshalb beginnen wir mit einer Klonoperation var tomorrow = ....)

3. Verwenden von DateJS , das jedoch seit langem nicht mehr aktualisiert wurde:

var today = new Date(); // Or Date.today()
var tomorrow = today.add(1).day();

Aber ich habe Datum 2010-09-11 in einer Variablen unter Verwendung von document.getElementById ("Ankunftsdatum"). Wert, es zeigt ungültiges Datum
Santanu

1
@santanu: Das ist ein ganz anderes Problem: Datumsanalyse (Abrufen eines Datums durch Interpretation einer Zeichenfolge). Wenn dieses Format statisch ist, können Sie es selbst analysieren und die Ergebnisse in den DateKonstruktor ( new Date(year, month, date)) einspeisen. siehe Abschnitt 15.9.2.1 der Spezifikation ; Wenn Sie eine Reihe von Formaten akzeptieren möchten, schauen Sie sich auf jeden Fall DateJS an .
TJ Crowder

1
@santanu: Nur um das Folgende zu befolgen: Einige Browser analysieren dieses Format möglicherweise erfolgreich mit Date.parse(was eine Anzahl von Millisekunden zurückgibt, in die Sie dann eingeben können new Date(ms)). Aber Vorsicht, das kann von Browser zu Browser unterschiedlich sein. Bis vor kurzem konnten Implementierungen fast alles tun, was sie wollten Date.parse. Die neue Spezifikation der 5. Ausgabe hat jetzt ein Mindestformat, das akzeptiert werden muss, aber darauf würde ich noch nicht zählen.
TJ Crowder

Ich wollte einer Datumsinstanz nur eine Sekunde hinzufügen. Dies funktionierte für mich x = new Date(); x2 = new Date(x.getTime() + 1000), wobei 1000 ein Millisekunden-Inkrement ist.
Berto

1
@piavgh: An der ersten Lösung ist nichts auszusetzen, es ist nur so, wie Sie sie verwenden. DateObjekte sind veränderlich. Sie speichern dasselbe Date Objekt dreimal im Array. Wenn Sie drei verschiedene DateObjekte möchten , müssen Sie drei Objekte erstellen: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);

Aber ich habe Datum 2010-09-11 in einer Variablen unter Verwendung von document.getElementById ("Ankunftsdatum"). Wert, es zeigt ungültiges Datum
Santanu

1
@sanatu: In diesem Fall müssen Sie die Zeichenfolge so formatieren, dass der Browser sie akzeptiert. Chrome akzeptiert new Date("2009-09-11"), Firefox jedoch nicht. Ich denke, die meisten Browser akzeptieren new Date("2009/09/11")so eine einfache Lösung var arrivalDate = document.getElementById('arival_date').value; var dayAfter = new Date(arrival_date.replace(/-/g, '/')); dayAfter.setDate(dayAfter.getDate()+1);.
David Hedlund

5
Ein soliderer Ansatz als das Ersetzen -durch /und das Hoffen, dass Browser dies akzeptieren, besteht darin, die Zeichenfolge in Teile zu unterteilen: 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);Beachten Sie, dass wir m-1hier verwenden, da Javascript-Monate Enum-Werte sind (Januar 0, nicht 1) und d+1weil wir Ich mache die Inkrementierung bereits in der anfänglichen Zuweisung (sie wird automatisch für den 29. Februar usw. korrigiert)
David Hedlund

35

Keines der Beispiele in dieser Antwort scheint mit Tagen zur Anpassung der Sommerzeit zu funktionieren. An diesen Tagen beträgt die Anzahl der Stunden an einem Tag nicht 24 (23 oder 25, je nachdem, ob Sie "vorwärts springen" oder "zurückfallen").

Die folgende Javascript-Funktion von AddDays berücksichtigt die Sommerzeit:

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

Hier sind die Tests, mit denen ich die Funktion getestet habe:

    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

Am einfachsten ist es, in Millisekunden zu konvertieren und 1000 * 60 * 60 * 24 Millisekunden hinzuzufügen, z.

var tomorrow = new Date(today.getTime()+1000*60*60*24);

Ich liebe diese eine ganzzahlige Repräsentationsregel.
Exebook

Dies ist die beste Antwort. Kann leicht so viele Tage wie gewünscht inkrementieren / dekrementieren; nur durch Multiplikation von 1000*60*60*24xDaysToBeAdded
Khalil Khalaf

Oder, new Date(+new Date() + 1000*60*60*24)aber es ist tatsächlich ähnlich wie getTime()/ setTime(), wirklich.
Polv

1
Tun Sie dies nur, wenn Ihr Datum in UTC oder einer anderen Zeitzone ohne Sommerzeit liegt. Andernfalls führt dies an 2 Tagen im Jahr zu unerwarteten Ergebnissen.
ItalyPaleAle

Ein new Date(Date.now()+1000*60*60*24);
Einzeiler

28

Morgen in einer Zeile in reinem JS, aber es ist hässlich !

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

Hier ist das Ergebnis:

Thu Oct 12 2017 08:53:30 GMT+0200 (Romance Summer Time)

14

Sie müssen zuerst Ihre Zeichenfolge analysieren, bevor Sie dem Vorschlag der anderen Personen folgen können:

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

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

Wenn Sie es wieder im gleichen Format haben möchten, müssen Sie dies "manuell" tun:

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

Aber ich schlage vor, Date.js zu bekommen, wie in anderen Antworten erwähnt, das wird Ihnen sehr helfen .


7

Ich bin der Meinung, dass nichts sicherer ist als .getTime()und .setTime(), daher sollte dies das Beste und auch das Performanteste sein.

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

.setDate() Ein ungültiges Datum (wie 31 + 1) ist zu gefährlich und hängt von der Browser-Implementierung ab.


5

Die nächsten 5 Tage bekommen:

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

Versuchte die obigen Antworten aber vergebens. Ihr Code hat wie ein Zauber funktioniert. Vielen Dank!
dimmat

4

Zwei Methoden:

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: Ähnlich wie bei der vorherigen Methode

var a = new Date()
// no_of_days is an integer value
var b = new Date(a.setDate(a.getDate() + no_of_days)

2

Holen Sie sich den String - Wert des Datums mit dem dateObj.toJSON () -Methode Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON Scheibe das Datum aus dem zurück Wert und erhöhen Sie dann um die Anzahl der gewünschten Tage.

var currentdate = new Date();
currentdate.setDate(currentdate.getDate() + 1);
var tomorrow = currentdate.toJSON().slice(0,10);

Date.toJSON verwendet die UTC-Zeitzone 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);
}

Beispiel

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

Ergebnis

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

Ihr Code funktioniert nicht. Ich habe es mit der ersten console.log () versucht und es heißt: dt.AddDays () ist keine Funktion.
Adrian2895

1

Nicht ganz sicher, ob es sich um einen BUG handelt (Tested Firefox 32.0.3 und Chrome 38.0.2125.101), aber der folgende Code schlägt in Brasilien fehl (-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+"");

Ergebnis:

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

Wenn Sie dem Datum eine Stunde hinzufügen, funktioniert es einwandfrei (löst das Problem jedoch nicht).

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

Ergebnis:

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

Ergibt eine Zeichenfolgendarstellung des morgigen Datums. Verwenden Sie new Date (), um das heutige Datum abzurufen, fügen Sie mit Date.getDate () und Date.setDate () einen Tag hinzu und konvertieren Sie das Date-Objekt in eine Zeichenfolge.

  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

Inkrementieren des Datumsjahres mit Vanille 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

Nur für den Fall, dass jemand einen anderen Wert als das Datum (Tag) erhöhen möchte


1

Über native JS können Sie eines Tages Folgendes hinzufügen:

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

Eine andere Option ist die Verwendung der momentBibliothek:

const date = moment().add(14, "days").toDate()

1
Bitte erläutern Sie, was dieser Code bewirkt. Fügen Sie Details hinzu, wie das OP-Problem behoben wird.
Yash

1

Datumsinkrement für Zeitzone / Sommerzeit für JavaScript-Daten:

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);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.