wake-up-neo.com

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

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

690
Morgan Cheng

Verwenden einer Bibliothek

Wenn Sie viel mit Datum arbeiten, 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 Chaos Antwort , aber in einer Zeile:

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

Wobei diff die Differenz in Minuten zur oldDateObj -Zeit ist. 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 falls dies nicht offensichtlich ist, multiplizieren wir die Minuten mit 60000, um die Minuten in Millisekunden umzuwandeln.

Seien Sie vorsichtig mit Vanilla Javascript. Termine sind hart!

Du denkst vielleicht, du kannst ein Datum um 24 Stunden verlängern, um das morgige Datum zu erhalten, oder? Falsch!

addMinutes(myDate, 60*24); //DO NOT DO THIS

Wenn der Benutzer die Sommerzeit einhält, ist ein Tag nicht unbedingt 24 Stunden lang. 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, immer 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 ist möglicherweise zu viel oder unmöglich für Ihr Projekt. Die Syntax ist der Funktion MySQL DATE_ADD 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;
}

Working jsFiddle Demo .

856
Kip
var d1 = new Date (),
    d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );
212
Jamie
var oldDateObj = new Date();
var newDateObj = new Date();
newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000));
console.log(newDateObj);
143
chaos
var now = new Date();
now.setMinutes(now.getMinutes() + 30); // timestamp
now = new Date(now); // Date object
console.log(now);
93
Teo Graca

Vielleicht so etwas?

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

console.log(v)
40
Tyler Carter

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

Sie können ein Beispiel hier 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;
        };
30
Jacobi

Die einfachste Lösung besteht darin, zu erkennen, dass Datumsangaben in Javascript nur Zahlen sind. Es startet 0 oder 'Wed Dec 31 1969 18:00:00 GMT-0600 (CST). Jeder 1 steht für eine Millisekunde. Sie können Millisekunden addieren oder subtrahieren, indem Sie den Wert abrufen und mit diesem Wert ein neues Datum instanziieren. Sie können es mit diesem Verstand ziemlich einfach handhaben.

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)
12
tsacodes

Das ist, was ich tue, 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 kannst du das einfach so nennen:

var now = new Date();
console.log(now.addMinutes(50));
9
Jonathan

Ich bin der Meinung, dass vielen Antworten hier eine kreative Komponente fehlt, die für Zeitreiserechnungen 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]());
}
5
unsynchronized

Hier ist die ES6 Version:

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

Nennen Sie es wie folgt:

getTimeAfter30Mins();
5
student

Verwenden Sie eine vorhandene Bibliothek, die dafür bekannt ist, die Probleme zu lösen, die beim Umgang mit Zeitberechnungen auftreten. 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>
2
Ouroborus

Nur eine weitere Option, die ich geschrieben habe:

DP_DateExtensions Library

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

Unterstützt Datums-/Uhrzeitformatierung, Datumsberechnung (Addieren/Subtrahieren von Datumsteilen), Datumsvergleich, Datumsanalyse usw. Es ist großzügig offen angelegt.

1
Jim Davis

Für die Faulen wie ich:

Kips Antwort (von oben) im Kaffeeskript, mit einer "Enumeration" und der Operation auf dasselbe Objekt:

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
1
Blaskovicz