Wie füge ich einem JavaScript-Datumsobjekt 30 Minuten hinzu?

785

Ich möchte ein Datumsobjekt erhalten, das 30 Minuten später als ein anderes Datumsobjekt ist. Wie mache ich das mit JavaScript?

Morgan Cheng
quelle
1
Ich habe ein kleines Kalender-Popup-Skript in js erstellt, das sich auf Github befindet. Vielleicht sehen Sie sich den Code an, um zu sehen, wie das Datumsobjekt miteinander verbunden ist. Überprüfen Sie auch das Javascript Kit als eine großartige js-Referenz, insbesondere für das Datumsobjekt.
Christian
2
Alle Antworten, die eine Variation von verwenden, date.setMinutes(date.getMinutes() + ...)werden die Grenzen der Sommerzeit nicht überschreiten. Zum Beispiel (vorausgesetzt, '2014-03-09' ist eine Sommerzeitgrenze): var d = new Date('2014-03-09 01:59:00'), f = new Date(d.getTime()); d.setMinutes(d.getMinutes() + 30); dist jetzt 30 Minuten früher, nicht später als f.
Spig
1
@Spig: 30 Minuten nach 01:59 Uhr an der Sommerzeitgrenze ist 01:29 Uhr. Es liegt kein Fehler vor. Wenn Sie fund drucken d, sehen Sie, dass einer "GMT-0500" sagt, der andere "GMT-0400" (oder was auch immer Ihre Zeitzone ist). Wenn Sie .getTime()beide fund aufrufen d, werden Sie feststellen, dass diese fgrößer als d(dh später) ist.
Kip
1
@Spig: Interessant, habe es auf Firefox versucht und es hat funktioniert. Ich denke, es fällt in eine Grauzone in der Spezifikation, wie getMinutes () funktionieren soll. 01:89würde werden 02:29, was an dem Tag nicht existiert, an dem du "vorwärts springst". Chrome entscheidet, dass dies sein soll 01:29, FF entscheidet sich dafür 03:29. In der Nacht, in der Sie "zurückfallen", überspringen beide Browser die "zurückfallen" -Stunde und springen um 90 Minuten vorwärts, um 02:29. Hier sind einige JSFiddle-Demos: "spring forward" / "fall back"
Kip
1
Wenn eine der folgenden Antworten Ihre Frage beantwortet und die Funktionsweise dieser Website funktioniert, würden Sie die Antwort "akzeptieren", mehr hier: Was soll ich tun, wenn jemand meine Frage beantwortet? . Aber nur wenn Ihre Frage wirklich beantwortet wurde. Wenn nicht, sollten Sie der Frage weitere Details hinzufügen.
Auf Wiedersehen StackExchange

Antworten:

951

Verwenden einer Bibliothek

Wenn Sie viel Datumsarbeit leisten, sollten Sie sich JavaScript- Datumsbibliotheken wie Datejs oder Moment.js ansehen . Bei Moment.js ist dies beispielsweise einfach:

var newDateObj = moment(oldDateObj).add(30, 'm').toDate();

Vanille-Javascript

Dies ist wie die Antwort des Chaos , aber in einer Zeile:

var newDateObj = new Date(oldDateObj.getTime() + diff*60000);

Wo diffist der Unterschied in Minuten, den Sie von oldDateObjder Zeit möchten ? Es 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 nur für den Fall, dass dies nicht offensichtlich ist, multiplizieren wir Minuten mit 60000Minuten in Millisekunden.

Seien Sie vorsichtig mit Vanilla Javascript. Termine sind schwer!

Sie denken vielleicht, Sie können einem Datum 24 Stunden hinzufügen, um das Datum von morgen 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 USA und Kanada ist der 2. November 2014 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!

Aus diesem Grund ist die Verwendung einer der oben genannten Bibliotheken sicherer, wenn Sie viel damit arbeiten müssen.

Unten ist eine allgemeinere Version dieser Funktion, die ich geschrieben habe. Ich würde immer noch empfehlen, eine Bibliothek zu verwenden, aber das kann für Ihr Projekt übertrieben / unmöglich sein. Die Syntax ist der MySQL DATE_ADD- Funktion nachempfunden .

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

Arbeitende jsFiddle-Demo .

Pennen
quelle
14
Das ist sehr mächtig; Es funktioniert für eine beliebige Anzahl von Minuten, auch wenn die Zahl negativ war.
Wahid Bitar
3
Für Sekunden multiplizieren Sie mit 1000 statt 60k.
Asche999
2
Die Funktion dateAdd () ist großartig! Aber es gibt eine Anmerkung von mir - semantisch sollte die Einheit "Minute", "Sekunde" usw. sein und das Intervall sollte der Betrag (2, 10, 45, ...) sein, nicht umgekehrt. Ansonsten ist die Idee gut.
Vasil Popov
1
Diese Antwort berücksichtigt keine monatlichen Rollover, sodass der 31. Januar plus ein Monat den 2. oder 3. März ergibt, je nachdem, ob es sich um ein Schaltjahr handelt oder nicht. Die Funktionen addMonths und addYears in Jacobis Antwort befassen sich damit. Für mich ist es eine bessere Antwort.
RobG
1
@ RobG Guter Punkt. Ich habe einen Fix dafür hinzugefügt und den Punkt "Verwenden Sie eine Bibliothek, wenn möglich" weiter betont.
Kip
238
var d1 = new Date ();
var d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );
Jamie
quelle
114
@ Jamie: Du brauchst keine zwei DateObjekte. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner
15
@Grant: Ich nahm an, d2 = "Ich möchte ein Datumsobjekt erhalten" und d1 = "zu einem anderen
Jamie
7
@CKeene, setMinutes & getMinutes sind Teil des einfachen alten Javascript (obwohl datejs eine ganze Reihe anderer Dinge bietet).
29.
4
Zu Ihrer Information: Dies kann die Grenzen der Sommerzeit überschreiten. JSFiddle-Demos: "spring forward" / "fall back" (Danke @Spig dafür)
Kip
@trevorgrayson Wenn ein von Ihnen angegebener Parameter außerhalb des erwarteten Bereichs liegt, versucht setMinutes (), die Datumsinformationen entsprechend zu aktualisieren. Wenn Sie beispielsweise 100 verwenden, werden die Stunden um 1 erhöht und 40 Minuten für Minuten verwendet.
Mihai Crăiță
155

var oldDateObj = new Date();
var newDateObj = new Date();
newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000));
console.log(newDateObj);

Chaos
quelle
3
Beachten Sie, dass setTimeein numerischer Millisekunden-Zeitstempel zurückgegeben wird, kein Datumsobjekt. (Denken Sie nicht, dass Sie einen Einzeiler machen können.)
Alan H.
12
var in30Mins = new Date(+new Date() + 1.8e6)ist ein Einzeiler, aber nicht sicher, ob es besser ist als ein Zweiliner. ;-)
RobG
112

var now = new Date();
now.setMinutes(now.getMinutes() + 30); // timestamp
now = new Date(now); // Date object
console.log(now);

Teo Graca
quelle
9
Ich habe bemerkt, dass ich ein Duplikat davon gepostet habe. Gelöscht und stattdessen +1.
Izzy
3
einfachste Antwort auf diese Frage
Vijay
Ich denke, setMinutesgibt den Zeitstempel zurück, nowbleibt aber das DateObjekt, now = new Date(now)ist also veraltet
p.boiko
46

Vielleicht so etwas?

var d = new Date();
var v = new Date();
v.setMinutes(d.getMinutes()+30);

console.log(v)

Tyler Carter
quelle
6
@ Chacha102: Du brauchst keine zwei DateObjekte. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner
12
Er wollte zwei Datumsobjekte. Lies die Frage. Ein Datumsobjekt, das 30 Minuten vor einem anderen Datumsobjekt liegt.
Tyler Carter
5
Funktioniert das in Ordnung, wenn es nach einer Stunde wiederholt wird? Wenn ich es also um 11:59 Uhr anrufe, ist der Zeitplan um 12:29 Uhr in Ordnung?
Chris Rae
1
@ ChrisRae ja, das tut es. If a parameter you specify is outside of the expected range, setMinutes() attempts to update the date information in the Date object accordingly.
Fridoo
35

Ich erstelle immer 7 Funktionen, um mit dem Datum in JS zu arbeiten: addSeconds, addMinutes, addHours, addDays, addWeeks, addMonths, addYears.

Sie können hier ein Beispiel sehen: http://jsfiddle.net/tiagoajacobi/YHA8x/

Wie benutzt man:

var now = new Date();
console.log(now.addMinutes(30));
console.log(now.addWeeks(3));

Dies sind die Funktionen:

        Date.prototype.addSeconds = function(seconds) {
            this.setSeconds(this.getSeconds() + seconds);
            return this;
        };

        Date.prototype.addMinutes = function(minutes) {
            this.setMinutes(this.getMinutes() + minutes);
            return this;
        };

        Date.prototype.addHours = function(hours) {
            this.setHours(this.getHours() + hours);
            return this;
        };

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

        Date.prototype.addWeeks = function(weeks) {
            this.addDays(weeks*7);
            return this;
        };

        Date.prototype.addMonths = function (months) {
            var dt = this.getDate();

            this.setMonth(this.getMonth() + months);
            var currDt = this.getDate();

            if (dt !== currDt) {  
                this.addDays(-currDt);
            }

            return this;
        };

        Date.prototype.addYears = function(years) {
            var dt = this.getDate();

            this.setFullYear(this.getFullYear() + years);

            var currDt = this.getDate();

            if (dt !== currDt) {  
                this.addDays(-currDt);
            }

            return this;
        };
Jacobi
quelle
Kann jemand ein Problem mit diesem Ansatz sehen?
Der Dembinski
1
Verwenden Sie stattdessen moment.js
Victor Pudeyev
@ TheDembinski - welche Probleme erwarten Sie? Das Erweitern von integrierten Funktionen wird im Allgemeinen nicht gemocht, aber ich kann kein Problem mit Date feststellen. Es wäre schön, wenn jedes Hauptinkrement optional auch seine Nebeninkremente festlegen würde (wie es die set * -Methoden tun), sodass addHours optional Minuten, Sekunden und Millisekunden dauerte, sodass Sie date.addHours(3, 30)3 Stunden und 30 Minuten hinzufügen konnten . addYears würde Jahre, Monate und Tage dauern, addMonths würde Monate und Tage dauern, addMinutes würde Minuten, Sekunden, Millisekunden usw.
dauern
1
Hallo @transformer, ich würde so etwas tun. new Date().addHours(4).addMinutes(45);Sie können so viele aufrufen, wie Sie möchten, da die Methoden "this" zurückgeben, das das aktuelle Datumsobjekt ist.
Jacobi
1
Hallo @transformer, ich bin nicht sicher, ob ich Ihr Problem verstanden habe, aber dies sind Prototypenfunktionen, die Sie in beliebiger Reihenfolge verwenden können, z. B. var dt = new Date();dann dt.addMinutes(45); dt.addHours(4);oder sogar dt.addMinutes(285);oder auch dt.addMinutes(45).addHours(4);alle werden funktionieren. Wenn Sie eine Frage mit einem Codebeispiel haben, können Sie diese für Ihr Problem hier posten. Ich helfe Ihnen gerne weiter.
Jacobi
13

Der einfachste Weg zu lösen ist zu erkennen, dass in Javascript Daten nur Zahlen sind. Es beginnt 0oder 'Wed Dec 31 1969 18:00:00 GMT-0600 (CST). Jeder 1repräsentiert eine Millisekunde. Sie können Millisekunden addieren oder subtrahieren, indem Sie den Wert abrufen und mit diesem Wert ein neues Datum instanziieren. Mit diesem Verstand können Sie es ziemlich einfach schaffen.

const minutesToAdjust = 10;
const millisecondsPerMinute = 60000;
const originalDate = new Date('11/20/2017 10:00 AM');
const modifiedDate1 = new Date(originalDate.valueOf() - (minutesToAdjust * millisecondsPerMinute));
const modifiedDate2 = new Date(originalDate.valueOf() + (minutesToAdjust * millisecondsPerMinute));

console.log(originalDate); // Mon Nov 20 2017 10:00:00 GMT-0600 (CST)
console.log(modifiedDate1); // Mon Nov 20 2017 09:50:00 GMT-0600 (CST)
console.log(modifiedDate2); // Mon Nov 20 2017 10:10:00 GMT-0600 (CST)
Tsacodes
quelle
10

Das mache ich, was ziemlich gut zu funktionieren scheint:

Date.prototype.addMinutes = function(minutes) {
    var copiedDate = new Date(this.getTime());
    return new Date(copiedDate.getTime() + minutes * 60000);
}

Dann können Sie das einfach so nennen:

var now = new Date();
console.log(now.addMinutes(50));
Jonathan
quelle
2
Sie könnten einfach tun return new Date(this.getTime() + minutes * 60000);, ich das vorläufige kopierte Datum ist nicht notwendig. ;-)
RobG
5

Hier ist die ES6- Version:

let getTimeAfter30Mins = () => {
  let timeAfter30Mins = new Date();
  timeAfter30Mins = new Date(timeAfter30Mins.setMinutes(timeAfter30Mins.getMinutes() + 30));
};

Nennen Sie es wie:

getTimeAfter30Mins();
Xameeramir
quelle
Ich habe Benutzer, die 4:30 Uhr + 2:15 Uhr / Minute eingeben. Wie kann ich Benutzer Stunden und Minuten verstreichen lassen und sie zu vorhandenen Stunden hinzufügen?
Transformator
@transformer Sie können verschiedene Eingabefelder für Stunden, Minuten usw. mit Nummernüberprüfungen angeben.
Xameeramir
5

Ich bin der Meinung, dass vielen der Antworten hier eine kreative Komponente fehlt, die für Zeitreiseberechnungen dringend benötigt wird. Ich präsentiere meine Lösung für eine zeitliche Übersetzung von 30 Minuten.

(jsfiddle hier )

function fluxCapacitor(n) {
    var delta,sigma=0,beta="ge";
    (function(K,z){

        (function(a,b,c){
            beta=beta+"tT";
            switch(b.shift()) {
                case'3':return z('0',a,c,b.shift(),1);
                case'0':return z('3',a,c,b.pop());
                case'5':return z('2',a,c,b[0],1);
                case'1':return z('4',a,c,b.shift());
                case'2':return z('5',a,c,b.pop());
                case'4':return z('1',a,c,b.pop(),1);
            }
        })(K.pop(),K.pop().split(''),K.pop());
    })(n.toString().split(':'),function(b,a,c,b1,gamma){
       delta=[c,b+b1,a];sigma+=gamma?3600000:0; 
       beta=beta+"im";
    });
    beta=beta+"e";
    return new Date (sigma+(new Date( delta.join(':')))[beta]());
}
nicht synchronisiert
quelle
Ich muss zugeben, dass dies kreativ ist. Aber Mann .. Das ist schwer zu lesen!
Erik Baan
2

Für die Faulen wie mich:

Kips Antwort (von oben) in Coffeescript unter Verwendung einer "Aufzählung" und Bearbeitung desselben Objekts:

Date.UNIT =
  YEAR: 0
  QUARTER: 1
  MONTH: 2
  WEEK: 3
  DAY: 4
  HOUR: 5
  MINUTE: 6
  SECOND: 7
Date::add = (unit, quantity) ->
  switch unit
    when Date.UNIT.YEAR then @setFullYear(@getFullYear() + quantity)
    when Date.UNIT.QUARTER then @setMonth(@getMonth() + (3 * quantity))
    when Date.UNIT.MONTH then @setMonth(@getMonth() + quantity)
    when Date.UNIT.WEEK then @setDate(@getDate() + (7 * quantity))
    when Date.UNIT.DAY then @setDate(@getDate() + quantity)
    when Date.UNIT.HOUR then @setTime(@getTime() + (3600000 * quantity))
    when Date.UNIT.MINUTE then @setTime(@getTime() + (60000 * quantity))
    when Date.UNIT.SECOND then @setTime(@getTime() + (1000 * quantity))
    else throw new Error "Unrecognized unit provided"
  @ # for chaining
Blaskovicz
quelle
2

Verwenden Sie eine vorhandene Bibliothek, die dafür bekannt ist, die mit Zeitberechnungen verbundenen Macken zu bewältigen. Mein aktueller Favorit ist moment.js .

<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.js"></script>
<script>
 var now = moment(); // get "now"
 console.log(now.toDate()); // show original date
 var thirty = moment(now).add(30,"minutes"); // clone "now" object and add 30 minutes, taking into account weirdness like crossing DST boundries or leap-days, -minutes, -seconds.
 console.log(thirty.toDate()); // show new date
</script>
Ouroborus
quelle
3
Die Antworten können sich nicht verbessern, wenn Sie ohne Angabe von Gründen abstimmen.
Ouroborus
Das OP bat um eine JavaScript-Lösung, nicht um ein Framework / eine Bibliothek.
Mattpark22
2
@ mattpark22 Während ich verstehe, worauf Sie hinaus wollen, ist eine Javascript-Bibliothek immer noch Javascript. Ich könnte nur die relevanten Teile der Bibliothek herausreißen und diese als Codelösung präsentieren. OP hätte eine Antwort, die Javascript war, in dem Sinne, wie Sie es meinen, aber keine (möglicherweise) akzeptable Allzwecklösung kennen würde. Außerdem ist das Hinzufügen von 30 Minuten bei weitem nicht so trivial, wie es die meisten Antworten klingen lassen, da es viele Randfälle gibt, die vom Date-Objekt nicht behandelt werden. Beispielsweise wird die beliebteste Antwort beim Überschreiten der Sommerzeitgrenzen unterbrochen.
Ouroborus
@ Ouroborus - Bibliotheken sollten nicht die einzige Lösung sein, die bereitgestellt wird, wenn das OP nicht nach einer Bibliothek im OP oder nach Tags gefragt hat. Andernfalls können Antworten nur eine Litanei von Möglichkeiten sein, etwas in verschiedenen Bibliotheken zu tun, und das OP bleibt seinem eigentlichen Problem nicht klüger (was in diesem Fall ziemlich trivial zu lösen ist).
RobG
1
@RobG Niemand schlägt vor, nur Bibliothekslösungen bereitzustellen. OP kann nicht speziell nach einer Bibliothek fragen, da dies dazu führen würde, dass die Frage nicht zum Thema gehört. Fragen "Wie mache ich das mit JavaScript?" könnte so ausgelegt werden, dass angegeben wird, dass dies spezifisch für Javascript ist (nach einer Lösung in einer bestimmten Sprache fragen, anstatt nach einer Rohcodelösung zu fragen), insbesondere angesichts der Tatsache, dass dieses Detail im Titel und in den Tags wiederholt wird.
Ouroborus
1

Nur eine weitere Option, die ich geschrieben habe:

DP_DateExtensions-Bibliothek

Es ist übertrieben, wenn dies die gesamte Datumsverarbeitung ist, die Sie benötigen, aber es wird tun, was Sie wollen.

Unterstützt Datums- / Zeitformatierung, Datumsberechnung (Hinzufügen / Subtrahieren von Datumsteilen), Datumsvergleich, Datumsanalyse usw. Es ist großzügig Open Source.

Jim Davis
quelle
1

Sie könnten dies tun:

let thirtyMinutes = 30 * 60 * 1000; // convert 30 minutes to milliseconds
let date1 = new Date();
let date2 = new Date(date1.getTime() + thirtyMinutes);
console.log(date1);
console.log(date2);

rayalois22
quelle
1

Hier ist mein Einzeiler:

console.log('time: ', new Date(new Date().valueOf() + 60000))

Jason Mullings
quelle
1

Sie sollten den Wert des aktuellen Datums abrufen, um das Datum mit (ms) abzurufen, und (30 * 60 * 1000) hinzufügen. Jetzt haben Sie (aktuelles Datum + 30 min) mit ms

console.log('with ms', Date.now() + (30 * 60 * 1000))
console.log('new Date', new Date(Date.now() + (30 * 60 * 1000)))

Abdulrahman Fawzy
quelle
0

Ich weiß, dass das Thema viel zu alt ist. Aber ich bin mir ziemlich sicher, dass es einige Entwickler gibt, die das noch brauchen, also habe ich dieses einfache Skript für Sie erstellt. Ich hoffe du genießt es!

function strtotime(date, addTime){
  let generatedTime=date.getTime();
  if(addTime.seconds) generatedTime+=1000*addTime.seconds; //check for additional seconds 
  if(addTime.minutes) generatedTime+=1000*60*addTime.minutes;//check for additional minutes 
  if(addTime.hours) generatedTime+=1000*60*60*addTime.hours;//check for additional hours 
  return new Date(generatedTime);
}

let futureDate = strtotime(new Date(), {
    hours: 1, //Adding one hour
    minutes: 45, //Adding fourty five minutes
    seconds: 0 //Adding 0 seconds return to not adding any second so  we can remove it.
});
<button onclick="alert(futureDate)">Travel to the future</button>

Adnane Ar
quelle