Fügen Sie dem JavaScript-Datum Tage hinzu

1095

So fügen Sie Datemit JavaScript Tage zum aktuellen hinzu . Hat JavaScript eine eingebaute Funktion wie die von .Net AddDay?

Ashesh
quelle

Antworten:

1210

Sie können eine erstellen mit: -

Date.prototype.addDays = function(days) {
    var date = new Date(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
}

var date = new Date();

alert(date.addDays(5));

Dadurch wird der Monat bei Bedarf automatisch erhöht. Zum Beispiel:

8/31 + 1 Tag wird 9/1 .

Das Problem bei der setDatedirekten Verwendung ist, dass es sich um einen Mutator handelt und dass solche Dinge am besten vermieden werden. ECMA hielt es für angebracht, Dateeher als veränderliche Klasse als als unveränderliche Struktur zu behandeln.

AnthonyWJones
quelle
17
Vereinfacht:Date.prototype.addDays=function(d){return new Date(this.valueOf()+864E5*d);};
Duncan
27
@ Duncan Sind Sie sicher, dass dies das gleiche wie oben ist? Dieser fügt einfach 24 Stunden hinzu, aber ein Tag ist nicht immer 24 Stunden . Ich denke, die Frage ist, wie man den Datumsteil um 1 Tag erhöht, ohne den Zeitteil zu ändern.
Tamás Bolvári
88
864E5Aus irgendeinem Grund schreibe ich lieber 24*60*60in meinen Code :)
Mars Robertson
62
Leute, verwenden Sie nicht die Methode zum Hinzufügen von 864E5, da dies keine Sommerzeitdifferenz erfordert, wenn die Tage 23 oder 25 Stunden betragen können.
sbrbot
12
Für diejenigen unter Ihnen, die sich Sorgen um die Sommerzeit machen - nicht. Diese Algorithmen ändern das zugrunde liegende Datum und nicht die Interpretation des Datums. Die Sommerzeit ist in den Gettern und Setzern des Datums implementiert - die Getter subtrahieren im Sommer eine Stunde und der Setter addiert diese Stunde im Sommer zurück, um die Zeit zu normalisieren. Aber nur bei Verwendung einer absoluten Stunde - relative Stunden müssen nicht interpretiert werden. Deshalb funktioniert Datumsmathematik. IMHO ...
Gerard ONeill
755

Richtige Antwort :

function addDays(date, days) {
  var result = new Date(date);
  result.setDate(result.getDate() + days);
  return result;
}

Falsche Antwort :

Diese Antwort liefert manchmal das richtige Ergebnis, gibt aber sehr oft das falsche Jahr und den falschen Monat zurück. Diese Antwort funktioniert nur dann, wenn das Datum, zu dem Sie Tage hinzufügen, zufällig das aktuelle Jahr und den aktuellen Monat enthält.

// Don't do it this way!
function addDaysWRONG(date, days) {
  var result = new Date();
  result.setDate(date.getDate() + days);
  return result;
}

Beweis / Beispiel

Überprüfen Sie diese JsFiddle

Ersatzbytes
quelle
@bzlm, ja im wesentlichen das gleiche. Der Date-Prototyp wird einfach nicht geändert. Ich wollte auch auf die Mängel in der Hauptantwort hinweisen.
Ersatzbytes
Die akzeptierte Antwort wurde vor zwei Wochen bearbeitet, um auf ihre Mängel hinzuweisen. Denken Sie, dass es weiterer Bearbeitung bedarf? Wenn das so ist, wie?
Bzlm
7
@bzlm: Ja, ich glaube, der Hinweis sollte lauten: "Dieser Ansatz schlägt fehl, wenn das Ab-Datum nicht im selben Jahr oder Monat wie das aktuelle Datum liegt. " Ich mache mir immer noch Sorgen, dass Benutzer einen Blick auf die Antwort werfen und die Warnung nicht lesen, da sie nicht auffällt. Vielen Dank.
Ersatzbytes
3
Ich denke, auch wenn diese Arbeit nicht korrekt ist. Es gibt keinen solchen Konstruktor für Datum: var result = neues Datum (Datum); Siehe http://www.w3schools.com/js/js_dates.asp . Selbst wenn dies normalerweise funktioniert, kann es aufgrund der Konvertierung in einen String manchmal zu falschen Ergebnissen kommen und umgekehrt. Es sollte var result = new Date (date.getTime ()) sein;
Marcin
2
@AnkitBalyan, Siehe andere Antworten. Es funktioniert möglicherweise nicht richtig aufgrund der Sommerzeit
Ersatzbytes
188
var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);

Seien Sie vorsichtig, da dies schwierig sein kann. Wenn Sie "morgen" einstellen, funktioniert dies nur, weil der aktuelle Wert mit dem Jahr und dem Monat für "heute" übereinstimmt. Die Einstellung auf eine Datumsnummer wie "32" funktioniert jedoch normalerweise immer noch einwandfrei, um sie auf den nächsten Monat zu verschieben.

Joel Coehoorn
quelle
1
Ja? Aber was ist das? (lief am 31. März 2010): heute = neues Datum (); morgen = neues Datum (); morgen.setDate (today.getDate () + 1); alert (morgen.getMonth ()); Sagt "3". Alarm (morgen); ist richtig ... Warum ???
d -_- b
12
@sims Monat ist 0 indiziert. Monat 3 ist April
Joel Coehoorn
7
Warum müssen 2 separate Datumsobjekte erstellt werden? Warum nicht einfach das gleiche Datumsobjekt verwenden : var d = new Date(); d.setDate( d.getDate() + 1 );?
Joseph Silber
8
Dieser Ansatz funktioniert nicht über Jahre hinweg. Wenn Ihr Startdatum vor einigen Jahren liegt, wird getDate()der Tag des Jahres zurückgegeben . Wenn Sie dann anrufen setDate, wird der Tag im aktuellen Jahr festgelegt . Es ist also KEINE gute allgemeine Lösung. Die Antwort von @ AnthonyWJones funktioniert tatsächlich korrekt.
Drew Noakes
3
@ DrewNoakes - Ihre Behauptung, dass es über Jahre hinweg nicht funktioniert, ist falsch. getDate gibt den Tag im Monat zurück, nicht den "Tag des Jahres". ZB var d = new Date(2015,11,30);d.setDate(d.getDate() + 370)gibt 3 Jan 2017, die 2 Jahre überschreitet.
RobG
124

Meine einfache Lösung ist:

nextday=new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+1);

Diese Lösung hat kein Problem mit der Sommerzeit. Man kann auch jeden Offset für Jahre, Monate, Tage usw. hinzufügen / unterschreiben.

day=new Date(oldDate.getFullYear()-2,oldDate.getMonth()+22,oldDate.getDate()+61);

ist der richtige Code.

sbrbot
quelle
13
Hinweis: Dies setzt die Zeit auf 00:00:00 zurück (kann ein Problem sein oder nicht)
Álvaro González
Funktioniert nicht am letzten Tag eines Monats, wie Sie sagen. Macht dies an 12 Tagen im Jahr unbrauchbar. Klingt nach einem Albtraum zum Debuggen !!!
Drew Noakes
6
Nein Drew, es ist für alle Tage im Jahr verwendbar. Sie können einen Datumsversatz größer als 31 oder einen Monatsversatz größer als 12 festlegen. Diese Funktion berechnet ihn als Tag im nächsten Monat oder Monat im nächsten Jahr neu. Zum Beispiel: nextday = new Date (oldDate.getFullYear (), oldDate.getMonth (), oldDate.getDate () + 40); ist vollkommen gut Code.
sbrbot
es gibt getMonth () + 22 - was denkst du wird es funktionieren?
sbrbot
1
Ich stimme zu, benutze diesen Weg. Wir hatten gerade einen Fehler wegen der Sommerzeit, weil wir verwendeten setDate.
Jelle
95

Diese Antworten erscheinen mir verwirrend, ich bevorzuge:

var ms = new Date().getTime() + 86400000;
var tomorrow = new Date(ms);

getTime () gibt uns Millisekunden seit 1970 an, und 86400000 ist die Anzahl der Millisekunden pro Tag. Daher enthält ms Millisekunden für das gewünschte Datum.

Die Verwendung des Millisekundenkonstruktors ergibt das gewünschte Datumsobjekt.

Jason
quelle
46
Diese Lösung berücksichtigt nicht die Sommerzeit. So wird zum Beispiel 23 Stunden später das gleiche Datum zurückgegeben:new Date(new Date('11/4/2012').getTime() + 86400000)
Noah Harrison
6
@NoahMiller Das Problem, das Sie ansprechen, könnte eine Funktion sein, kein Fehler! Das Hinzufügen von 24 Stunden pro Tag ist manchmal das Richtige, mit dem Ziel, die resultierende Zeit basierend auf der Sommerzeit zu kennen. Das Datum, an dem Ihr Beispiel zurückgegeben wird, hat am 4. November einen Zeitwert von 23 Uhr. Dies ist 24 Stunden später an diesem bestimmten Tag. Das Originalplakat fragte nach der Uhrzeit, was auf einen Wunsch nach korrekten Tageszeiten hindeutet. Diese Antwort ist richtig, wenn Sie in dem Fall sind, in dem Ihr Ziel die Zeit 24 Stunden später ist.
Andy Novocin
3
Ich bin damit einverstanden, dass Noah, var d2 = neues Datum (d1.valueOf () + 24 * 60 * 60 * 1000) das tut, was es sagt, einem Datum einen ganzen Tag an Zecken hinzufügt.
Corey Alix
6
Dies ist in einigen Fällen absolut korrekt (z. B. für 1-Tages-Cookies) und eine einfachere Lösung als die meisten anderen. Ich verstehe nicht, warum es so viele Downvotes und so wenige Upvotes gibt: /
Matmarbon
48

Versuchen

var someDate = new Date();
var duration = 2; //In Days
someDate.setTime(someDate.getTime() +  (duration * 24 * 60 * 60 * 1000));

Wenn Sie setDate () zum Hinzufügen eines Datums verwenden, wird Ihr Problem nicht gelöst. Versuchen Sie, einem Februar-Monat einige Tage hinzuzufügen. Wenn Sie versuchen, neue Tage hinzuzufügen, führt dies nicht zu den erwarteten Ergebnissen.

sufyan.shoaib
quelle
26
Nein, dies sollte nicht als die richtige Antwort markiert werden, da diese Lösung davon ausgeht, dass jeder Tag 24 * 60 * 60 * 1000 Sekunden hat, dies jedoch nicht (Sommerzeit)!
sbrbot
Irgendwelche Beweise für das 'Feb'-Problem mit setDate()? Ist es das: stackoverflow.com/questions/5497637/…
nobar
9
+1 Dies sollte als die richtige Antwort markiert werden. Ich glaube, bei "Sommerzeit" geht es um Präsentation und nicht um Wert , sondern nur um die Anzahl der Millisekunden. Vom Wert -Punkt Sicht - Tag ist CONST Anzahl von Millisekunden, während in Bezug auf die Präsentation kann es variieren.
am
1
@ disfated - Dies ist nicht die richtige Antwort. Der Tag ohne Sommerzeit hat 25 Stunden, aber diese Methode fügt nur 24 hinzu, sodass das Datum dasselbe ist. Die Verwendung von 24 Stunden zur Darstellung eines Tages funktioniert, wenn stattdessen UTC-Methoden verwendet werden. Warum ist die Verwendung von setDate jedoch praktischer? ;-)
RobG
38

Ich habe nur ewig versucht, herauszufinden, was der Deal mit dem Jahr war, das nicht hinzugefügt wurde, wenn ich den folgenden Beispielen folge.

Wenn Sie dem Datum, das Sie haben, einfach n Tage hinzufügen möchten, gehen Sie am besten einfach:

myDate.setDate (myDate.getDate () + n);

oder die langatmige Version

var theDate = new Date(2013, 11, 15);
var myNewDate = new Date(theDate);
myNewDate.setDate(myNewDate.getDate() + 30);
console.log(myNewDate);

Das heute / morgen Zeug ist verwirrend. Indem Sie das aktuelle Datum in Ihre neue Datumsvariable einstellen, wird der Jahreswert durcheinander gebracht. Wenn Sie ab dem ursprünglichen Datum arbeiten, werden Sie nicht.

Rumpleteaser
quelle
7
Lesen Sie alle Antworten, bis ich dieses Juwel hier finde. Das macht jetzt Sinn. Erstaunlich, dass das Heute / Morgen-Ding in fast allen Antworten kopiert wurde, wenn es überhaupt keinen Sinn ergibt und nicht "für Lesbarkeit und Klarheit" ist, wie der Autor in der am besten bewerteten Antwort - im am besten bewerteten Kommentar - sagt. es ist verwirrend und eine schlechte Praxis und falsch
Cesc
23

Wenn Sie können, verwenden Sie moment.js . JavaScript verfügt nicht über sehr gute native Datums- / Zeitmethoden. Das Folgende ist ein Beispiel für die Syntax von Moment:

var nextWeek = moment().add(7, 'days');
alert(nextWeek);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>

Referenz: http://momentjs.com/docs/#/manipulating/add/

user2910265
quelle
1
@ kpull1 Der Fragesteller hat die Lösungsdomäne nicht eingeschränkt, indem er gefragt hat, ob eine integrierte Lösung vorhanden ist.
user2910265
4
Moderner Hinweis: Moment.js ist unglaublich schwer für einen so kleinen Zweck hinzuzufügen. Es ist mehrere hundert KB groß und nicht sofort einsatzbereit.
Joshua Comeau
1
Unsere bevorzugte Bibliothek ist date-fns. Webpack-freundlich, schnell und behandelt Daten als unveränderlich.
Freewalker
1
@ LukeWilliams hat bis jetzt noch nie von Date-Fns gehört. werde es überprüfen. Vielen Dank.
user2910265
2
@JoshuaComeau Wenn Sie es von cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.3/moment.min.js herunterladen , belegt es 53.248 Byte auf der Festplatte. Ich stelle mir vor, das ist der ganze Wachsball, aber ich weiß es nicht. Wie auch immer, was auch immer. Es ist keine große Sache.
Birdus
22
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);

Serge
quelle
2
Upvote für das Fehlen einer Zwischendatenvariablen.
Jeff Lowery
Dies ist die beste Antwort, weil es keine Mutation hat
Knocte
Nicht jeder Tag hat 24 Stunden, es schlägt für Sommerzeit und Schaltsekunden fehl.
Stephan
19

Ich habe diese Erweiterungen letzte Nacht erstellt:
Sie können entweder positive oder negative Werte übergeben.

Beispiel:

var someDate = new Date();
var expirationDate = someDate.addDays(10);
var previous = someDate.addDays(-5);


Date.prototype.addDays = function (num) {
    var value = this.valueOf();
    value += 86400000 * num;
    return new Date(value);
}

Date.prototype.addSeconds = function (num) {
    var value = this.valueOf();
    value += 1000 * num;
    return new Date(value);
}

Date.prototype.addMinutes = function (num) {
    var value = this.valueOf();
    value += 60000 * num;
    return new Date(value);
}

Date.prototype.addHours = function (num) {
    var value = this.valueOf();
    value += 3600000 * num;
    return new Date(value);
}

Date.prototype.addMonths = function (num) {
    var value = new Date(this.valueOf());

    var mo = this.getMonth();
    var yr = this.getYear();

    mo = (mo + num) % 12;
    if (0 > mo) {
        yr += (this.getMonth() + num - mo - 12) / 12;
        mo += 12;
    }
    else
        yr += ((this.getMonth() + num - mo) / 12);

    value.setMonth(mo);
    value.setYear(yr);
    return value;
}
mark.nino.chua
quelle
7
Die Methode .addDays () funktioniert nicht für Daten, die die Grenzen der Sommerzeit überschreiten.
mskfisher
1
Dies ist eine der besseren Antworten hier, da Sie die Anzahl der Millis seit dem Epoc (korrekt) verwenden, um Datums- / Uhrzeitangaben darzustellen, und Millis für Anpassungen hinzufügen ... Warum haben Sie dies dann nicht für "addMonths" beibehalten? ? Und warum kein Jahr hinzufügen? Hast du dich gelangweilt?
Robin
Mit Ausnahme von Monaten können Zeiträume durch statische Zahlen dargestellt werden. Aber Monate können vier verschiedene Längen haben. Außerdem kann jede Zeitspanne von Tagen und höher bei Sommerzeit eine variable Länge haben, sodass Sie die zeitbasierte Addition nicht mehr ohne eine andere Komplexitätsstufe verwenden können. Ich habe addYears () hinzugefügt und addMonths () behoben.
Suamere
14

Ohne die zweite Variable zu verwenden, können Sie 7 durch Ihre nächsten x Tage ersetzen:

let d=new Date(new Date().getTime() + (7 * 24 * 60 * 60 * 1000));
Vaibhavmaster
quelle
14

zu subtrahieren 30 Tagen verbrauchen (24h = 86400000ms)

new Date(+yourDate - 30 *86400000)

Kamil Kiełczewski
quelle
Denken Sie beim Berechnen der Datums- und Uhrzeit immer daran, dass die Datums- und Uhrzeit basierend auf Millisekunden in der Informatik ( en.wikipedia.org/wiki/System_time#Retrieving_system_time ) neues Datum (+ yourDate + 30 * (24 * 60 * 60 * 1000)) ist.
Ashraf Abusada
13

Die einfachste Lösung.

 Date.prototype.addDays = function(days) {
   this.setDate(this.getDate() + parseInt(days));
   return this;
 };

 // and then call

 var newDate = new Date().addDays(2); //+2 days
 console.log(newDate);

 // or

 var newDate1 = new Date().addDays(-2); //-2 days
 console.log(newDate1);

Ampachten
quelle
Ich denke, das ist die beste Lösung. Wenn wir die Date-Klasse erweitern, ist es sinnvoller, dass die Date-Instanz selbst aktualisiert wird.
Porlune
10

Vielen Dank an Jason für Ihre Antwort, die wie erwartet funktioniert. Hier ist eine Mischung aus Ihrem Code und dem praktischen Format von AnthonyWJones:

Date.prototype.addDays = function(days){
    var ms = new Date().getTime() + (86400000 * days);
    var added = new Date(ms);
    return added;
}
Olivier
quelle
6
Die Sommerzeit wird nicht berücksichtigt, wenn ein Tag mehr oder weniger als 86400000 Sekunden hat, und kann zu logischen Fehlern (Programmfehler) in Ihrem Code führen.
sbrbot
Manchmal ist das nötig. Die eBay-API verfügt über X-Day-Auktionen, die rund um die Uhr verfügbar sind, sodass Ihr Artikel zu einem anderen Zeitpunkt endet als bei einer Änderung des Sommerzeitstatus während der Auktion. In diesem Fall müssen Sie diese Art von Funktion verwenden, um logische Fehler zu vermeiden.
Andy Novocin
10

Spät zur Party, aber wenn Sie verwenden jQuerydann ist es ein ausgezeichnetes Plugin namens Moment:

http://momentjs.com/

var myDateOfNowPlusThreeDays = moment().add(3, "days").toDate();

http://momentjs.com/docs/#/manipulating/

Und viele andere gute Sachen drin!

Bearbeiten: jQuery-Referenz dank Aikerus Kommentar entfernt

BemerkungLima
quelle
1
Moment braucht nicht jQuery :)
Aikeru
In diesem Fall sogar noch besser !!
RemarkLima
1
Ja, nachdem ich zu lange mit Plain ol 'JS rumgespielt habe, habe ich Moment benutzt und es funktioniert einfach (tm)!
caseyamcl
Warum sollten Sie das Plugin verwenden, wenn ein paar Zeilen JS ausreichen?
Frenchie
@frenchie weil, was als ein paar Zeilen JS beginnt und weil Ihre Anwendung eindeutig Tage, Datums- und Zeitinformationen manipuliert, es bald ein paar 1000 Zeilen JS sein werden, werden Sie aufgefordert, die App über zu lokalisieren 12 Sprachen und Zeitzonen und du hättest dir gewünscht, du hättest mit so etwas wie einem Moment
angefangen
10

Eine Lösung für den Pipeline-Betreiber :

const addDays = days => date => {
  const result = new Date(date);

  result.setDate(result.getDate() + days);

  return result;
};

Verwendungszweck:

// Without the pipeline operator...
addDays(7)(new Date());

// And with the pipeline operator...
new Date() |> addDays(7);

Wenn Sie mehr Funktionen benötigen, empfehle ich Ihnen, in die date-fns- Bibliothek zu schauen .

sdgfsdh
quelle
8

Alt weiß ich, aber manchmal mag ich das:

function addDays(days) {
    return new Date(Date.now() + 864e5 * days);
}
Todd
quelle
2
Dieser macht für mich am meisten Sinn. Es ist einfach, elegant und fällt nicht auf Probleme, die sich über Monate / Jahre bewegen.
Uadrive
1
Einfachste Antwort präsentiert. Darauf aufbauend wäre der Prototyp 'addDays' der folgende:Date.prototype.addDays = function(days) {return new Date(this.getTime() + (864e5 * days));};
CrazyIvan1974
Nicht jeder Tag hat 24 Stunden, es schlägt für Sommerzeit und Schaltsekunden fehl.
Stephan
8

Ich hatte Probleme mit der Sommerzeit mit der vorgeschlagenen Lösung.

Mit getUTCDate/ setUTCDatestattdessen habe ich mein Problem gelöst.

// Curried, so that I can create helper functions like `add1Day`
const addDays = num => date => {
  // Make a working copy so we don't mutate the supplied date.
  const d = new Date(date);

  d.setUTCDate(d.getUTCDate() + num);

  return d;
}
Joshua Comeau
quelle
8

Sie können JavaScript verwenden, keine jQuery erforderlich:

var someDate = new Date();
var numberOfDaysToAdd = 6;
someDate.setDate(someDate.getDate() + numberOfDaysToAdd); 
Formatting to dd/mm/yyyy :

var dd = someDate.getDate();
var mm = someDate.getMonth() + 1;
var y = someDate.getFullYear();

var someFormattedDate = dd + '/'+ mm + '/'+ y;
Rohit.007
quelle
8

Generischer Prototyp ohne Variablen, gilt für einen vorhandenen Datumswert:

Date.prototype.addDays = function (days) {
    return new Date(this.valueOf() + days * 864e5);
}
Matteo Conta
quelle
7

Die Mozilla-Dokumente für setDate () geben nicht an, dass sie Szenarien zum Monatsende verarbeiten. Siehe https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

Datum einstellen()

  • Legt den Tag des Monats (1-31) für ein bestimmtes Datum entsprechend der Ortszeit fest.

Deshalb verwende ich setTime (), wenn ich Tage hinzufügen muss.

Blake Mills
quelle
Ich würde auf die ECMAScript-Dokumente verlinken, aber sie werden als PDF veröffentlicht; (
Blake Mills
1
Zu " Mozilla-Dokumente für setDate () geben nicht an, dass Szenarien zum Monatsende behandelt werden ". Die "Dokumente" wurden aktualisiert, so dass sie dies jetzt tun. ;-)
RobG
7

So einfach ist das:

new Date((new Date()).getTime() + (60*60*24*1000));
Dila Gurung
quelle
2
Dies fügt zwar UTC-Tage hinzu, verwendet jedoch lokale Methoden und lässt keine lokalen Tage zu, die nicht 24 Stunden lang sind. Dies geschieht, wenn sich der Zeitzonenversatz ändert (z. B. innerhalb und außerhalb der Sommerzeit).
RobG
6

Ich denke, ich werde auch eine Antwort geben:
Ich persönlich versuche gerne, unbegründete Variablendeklarationen, Methodenaufrufe und Konstruktoraufrufe zu vermeiden, da sie alle teuer für die Leistung sind. (im Rahmen der Vernunft natürlich)
Ich wollte dies als Kommentar unter der Antwort von @AnthonyWJones belassen, dachte aber besser darüber nach.

// Prototype usage...
Date.prototype.addDays = Date.prototype.addDays || function( days ) {
    return this.setTime( 864E5 * days + this.valueOf() ) && this;
};

// Namespace usage...
namespace.addDaysToDate = function( date, days ) {
    return date.setTime( 864E5 * days + date.valueOf() ) && date;
};

// Basic Function declaration...
function addDaysToDate( date, days ) {
    return date.setTime( 864E5 * days + date.valueOf() ) && date;
};

Das oben Gesagte respektiert die Sommerzeit. Wenn Sie also eine Anzahl von Tagen hinzufügen, die die Sommerzeit überschreiten, ändert sich die angezeigte Zeit (Stunde) entsprechend.
Beispiel:
2. November 2014 02:00 war das Ende der Sommerzeit.

var dt = new Date( 2014, 10, 1, 10, 30, 0 );
console.log( dt );                  // Sat Nov 01 2014 10:30:00
console.log( dt.addDays( 10 ) );    // Tue Nov 11 2014 09:30:00

Wenn Sie die Zeit während der Sommerzeit beibehalten möchten (10:30 ist also immer noch 10:30) ...

// Prototype usage...
Date.prototype.addDays = Date.prototype.addDays || function( days ) {
    return this.setDate( this.getDate() + days ) && this;
};

// Namespace usage...
namespace.addDaysToDate = function( date, days ) {
    return date.setDate( date.getDate() + days ) && date;
};

// Basic Function declaration...
function addDaysToDate( date, days ) {
    return date.setDate( date.getDate() + days ) && date;
};

Also, jetzt hast du ...

var dt = new Date( 2014, 10, 1, 10, 30, 0 );
console.log( dt );                  // Sat Nov 01 2014 10:30:00
console.log( dt.addDays( 10 ) );    // Tue Nov 11 2014 10:30:00
Duncan
quelle
6

Nein, Javascript hat keine eingebaute Funktion, aber Sie können eine einfache Codezeile verwenden

timeObject.setDate(timeObject.getDate() + countOfDays);
Vahag Chakhoyan
quelle
5

Ich benutze so etwas wie:

new Date(dateObject.getTime() + amountOfDays * 24 * 60 * 60 * 1000)

Funktioniert mit Tagessparzeit:

new Date(new Date(2014, 2, 29, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)

Arbeitet mit Neujahr:

new Date(new Date(2014, 11, 31, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)

Es kann parametrisiert werden:

function DateAdd(source, amount, step) {
  var factor = 1;
  if (step == "day") factor = 24 * 60 * 60 * 1000;
  else if (step == "hour") factor = 60 * 60 * 1000;
  ...
  new Date(source.getTime() + amount * factor);
}
kpull1
quelle
4

Ich verwende die folgende Lösung.

var msInDay = 86400000;
var daysToAdd = 5;
var now = new Date();
var milliseconds = now.getTime();
var newMillisecods = milliseconds + msInDay * daysToAdd;
var newDate = new Date(newMillisecods);
//or now.setTime(newMillisecods);

Date hat einen Konstruktor, der ein int akzeptiert. Dieses Argument repräsentiert die Gesamtzahl der Millisekunden vor / nach dem 1. Januar 1970. Es verfügt auch über eine Methode setTime, die dasselbe tut, ohne ein neues Date-Objekt zu erstellen.

Wir konvertieren hier Tage in Millisekunden und addieren diesen Wert zu dem von getTime bereitgestellten Wert. Schließlich geben wir das Ergebnis an den Konstruktor Date (Millisekunden) oder an die Methode setTime (Millisekunden) weiter.

Vakhtang
quelle
Nicht jeder Tag hat 24 Stunden, es schlägt für Sommerzeit und Schaltsekunden fehl.
Stephan
Stephan, erklärt das eine andere Bibliothek?
Vakhtang
now.setDate(now.getDate() + days);behandelt automatisch DST-Änderungen. Und ich muss korrigieren, Schaltsekunden werden in JS-Zeitstempeln ignoriert.
Stephan
4

Bearbeiten: Anstelle von setTime()(oder setHours()) können Sie dies folgendermaßen tun:

Date.prototype.addDays= function(d){
  this.setDate(this.getDate() + d);
  return this;
};

var tomorrow = new Date().addDays(1);

Alt:

Anstatt zu verwenden setTime(), können Sie verwenden setHours():

Date.prototype.addDays= function(d){
    this.setHours(this.getHours() + d * 24);
    return this;
};

var tomorrow = new Date().addDays(1);

Siehe die JSFiddle ...

Spaark
quelle
Nach dieser Logik können Sie auch einen Tag hinzufügen;)d.setDate(d.getDate() + 1);
Rivenfall
4

Sehr einfacher Code zum Hinzufügen von Datumstagen in Java-Skript.

var d = new Date();
d.setDate(d.getDate() + prompt('how many days you want to add write here'));
alert(d);

Rana Aalamgeer
quelle
4

Es gibt eine setDate- und eine getDate- Methode, mit denen Sie Folgendes tun können:

var newDate = aDate.setDate(aDate.getDate() + numberOfDays);

Wenn Sie sowohl eine Anzahl von Tagen subtrahieren als auch Ihr Datum in einem für Menschen lesbaren Format formatieren möchten, sollten Sie ein benutzerdefiniertes DateHelperObjekt erstellen , das ungefähr so ​​aussieht:

var DateHelper = {
    addDays : function(aDate, numberOfDays) {
        aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
        return aDate;                                  // Return the date
    },
    format : function format(date) {
        return [
           ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
           ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
           date.getFullYear()                          // Get full year
        ].join('/');                                   // Glue the pieces together
    }
}

// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Add 20 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), 20));

(siehe auch diese Geige )

John Slegers
quelle
4

Das Erweitern des Prototyps in Javascript ist möglicherweise keine gute Idee , insbesondere in professionellen Codebasen.

Was Sie tun möchten, ist die native DateKlasse zu erweitern:

class MyCustomDate extends Date {

  addDays(days) {
    const date = new MyCustomDate(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
  }
  
}

const today = new MyCustomDate();

const nextWeek = today.addDays(7)

console.log(nextWeek)

Auf diese Weise werden addDaysSie nichts kaputt machen , wenn Javascript eines Tages eine native Methode implementiert .

Creaforge
quelle