Ich möchte ein Datumsobjekt erhalten, das 30 Minuten später als ein anderes Datumsobjekt ist. Wie kann ich das mit JavaScript erreichen?
Antworten
Zu viele Anzeigen?Verwendung einer Bibliothek
Wenn Sie viel mit Datumsangaben arbeiten, sollten Sie sich vielleicht mit JavaScript-Datumsbibliotheken wie Datejs ou Moment.js . Bei Moment.js ist dies zum Beispiel einfach:
var newDateObj = moment(oldDateObj).add(30, 'm').toDate();
Vanille-Javascript
Das ist wie Die Antwort des Chaos , aber in einer Zeile:
var newDateObj = new Date(oldDateObj.getTime() + diff*60000);
Wo diff
ist die Differenz in Minuten, die Sie von oldDateObj
der Zeit. Sie kann sogar negativ sein.
Oder als wiederverwendbare Funktion, wenn Sie dies an mehreren Stellen tun müssen:
function addMinutes(date, minutes) {
return new Date(date.getTime() + minutes*60000);
}
Und falls es nicht offensichtlich ist: Der Grund, warum wir die Minuten mit 60000
ist die Umrechnung von Minuten in Millisekunden.
Seien Sie vorsichtig mit Vanilla Javascript. Daten sind hart!
Sie denken vielleicht, dass Sie 24 Stunden zu einem Datum hinzufügen können, um das morgige Datum zu erhalten, oder? Falsch!
addMinutes(myDate, 60*24); //DO NOT DO THIS
Es stellt sich heraus, dass ein Tag nicht unbedingt 24 Stunden lang ist, wenn der Benutzer die Sommerzeit einhält. Es gibt einen Tag im Jahr, der nur 23 Stunden lang ist, und einen Tag im Jahr, der 25 Stunden lang ist. In den meisten Teilen der Vereinigten Staaten und Kanadas ist beispielsweise der 2. November 2014 auch 24 Stunden nach Mitternacht noch der 2. November:
const NOV = 10; //because JS months are off by one...
addMinutes(new Date(2014, NOV, 2), 60*24); //In USA, prints 11pm on Nov 2, not 12am Nov 3!
Das ist der Grund die Verwendung einer der oben genannten Bibliotheken ist eine sichere Sache wenn Sie viel damit arbeiten müssen.
Nachstehend finden Sie eine allgemeinere Version dieser Funktion, die ich geschrieben habe. Ich würde immer noch empfehlen, eine Bibliothek zu verwenden, aber das könnte für Ihr Projekt zu aufwendig/unmöglich sein. Die Syntax ist modelliert nach MySQL DATE_ADD Funktion.
/**
* Adds time to a date. Modelled after MySQL DATE_ADD function.
* Example: dateAdd(new Date(), 'minute', 30) //returns 30 minutes from now.
* https://stackoverflow.com/a/1214753/18511
*
* @param date Date to start with
* @param interval One of: year, quarter, month, week, day, hour, minute, second
* @param units Number of units of the given interval to add.
*/
function dateAdd(date, interval, units) {
if(!(date instanceof Date))
return undefined;
var ret = new Date(date); //don't change original date
var checkRollover = function() { if(ret.getDate() != date.getDate()) ret.setDate(0);};
switch(String(interval).toLowerCase()) {
case 'year' : ret.setFullYear(ret.getFullYear() + units); checkRollover(); break;
case 'quarter': ret.setMonth(ret.getMonth() + 3*units); checkRollover(); break;
case 'month' : ret.setMonth(ret.getMonth() + units); checkRollover(); break;
case 'week' : ret.setDate(ret.getDate() + 7*units); break;
case 'day' : ret.setDate(ret.getDate() + units); break;
case 'hour' : ret.setTime(ret.getTime() + units*3600000); break;
case 'minute' : ret.setTime(ret.getTime() + units*60000); break;
case 'second' : ret.setTime(ret.getTime() + units*1000); break;
default : ret = undefined; break;
}
return ret;
}
- See previous answers
- Weitere Antworten anzeigen