Come aggiungere 30 minuti a un oggetto Date JavaScript?


785

Vorrei ottenere un oggetto Date che è 30 minuti più tardi di un altro oggetto Date. Come lo faccio con JavaScript?


1
Ho creato un piccolo script pop-up del calendario in js, è su Github , forse guardo attraverso il codice per vedere come viene interagito l'oggetto data. Inoltre, controlla JavaScript Kit come un fantastico riferimento js, ​​specialmente per l'oggetto data.
Christian,

2
Tutte le risposte sottostanti che utilizzano una variazione di date.setMinutes(date.getMinutes() + ...)non supereranno i limiti dell'ora legale. Ad esempio (supponendo che "09-03-2014" sia un limite per l'ora legale): var d = new Date('2014-03-09 01:59:00'), f = new Date(d.getTime()); d.setMinutes(d.getMinutes() + 30); dora è 30 minuti prima, non più tardi di f.
Spig

1
@Spig: 30 minuti dopo l'1: 59 AM sul confine dell'ora legale è l'1: 29 AM. Non ci sono errori Se stampi fe dvedrai che uno dice "GMT-0500" l'altro dice "GMT-0400" (o qualunque sia il tuo fuso orario). Inoltre, se chiami .getTime()entrambi fe d, vedrai che fè più grande di d(cioè più tardi).
Kip

1
@Spig: interessante, l'ho provato su Firefox e ha funzionato. Penso che rientri in un'area grigia nella specifica di come dovrebbe funzionare getMinutes (). 01:89diventerebbe 02:29, che non esiste il giorno in cui "balzi in avanti". Chrome decide che dovrebbe essere 01:29, decide FF 03:29. Nella notte in cui "ripieghi", entrambi i browser saltano l'ora di "ripiegamento" e saltano avanti di 90 minuti, a 02:29. Ecco alcune demo di JSFiddle: "spring forward" / "fall back"
Kip

1
Se una delle risposte di seguito ha risposto alla tua domanda, il modo in cui funziona questo sito, "accetteresti" la risposta, più qui: Cosa devo fare quando qualcuno risponde alla mia domanda? . Ma solo se la tua domanda ha davvero avuto risposta. In caso contrario, considera di aggiungere ulteriori dettagli alla domanda.
Arrivederci StackExchange il

Risposte:


951

Utilizzando una biblioteca

Se stai facendo molto lavoro con la data, potresti voler esaminare le librerie di date JavaScript come Datejs o Moment.js . Ad esempio, con Moment.js, questo è semplicemente:

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

Vanilla Javascript

Questa è come la risposta del caos , ma in una riga:

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

Dov'è diffla differenza in minuti che vuoi dal oldDateObjtempo. Può anche essere negativo.

O come funzione riutilizzabile, se è necessario farlo in più punti:

function addMinutes(date, minutes) {
    return new Date(date.getTime() + minutes*60000);
}

E nel caso in cui ciò non sia ovvio, il motivo per cui moltiplichiamo i minuti 60000è convertire i minuti in millisecondi.

Fai attenzione con Javascript alla vaniglia. Le date sono difficili!

Potresti pensare di poter aggiungere 24 ore a una data per ottenere la data di domani, giusto? Sbagliato!

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

Si scopre che se l'utente osserva l'ora legale, un giorno non è necessariamente lungo 24 ore. C'è un giorno all'anno che dura solo 23 ore e un giorno all'anno che dura 25 ore. Ad esempio, nella maggior parte degli Stati Uniti e in Canada, 24 ore dopo la mezzanotte, il 2 novembre 2014, è ancora il 2 novembre:

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!

Questo è il motivo per cui usare una delle librerie sopra menzionate è una scommessa più sicura se devi fare molto lavoro con questo.

Di seguito è una versione più generica di questa funzione che ho scritto. Consiglio comunque di utilizzare una libreria, ma potrebbe essere eccessivo / impossibile per il tuo progetto. La sintassi è modellata sulla funzione DATE_ADD di MySQL .

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

Demo funzionante di jsFiddle .


14
Questo è molto potente; Funziona per qualsiasi quantità di minuti anche se il numero era negativo.
Wahid Bitar,

3
Per i secondi, moltiplicare per 1000 anziché 60k.
ashes999,

2
La funzione dateAdd () è fantastica! Ma c'è una mia nota: semanticamente, l' unità dovrebbe essere "minuto", "secondo", ecc. E l' intervallo dovrebbe essere l'importo (2, 10, 45, ...), non viceversa. Altrimenti l'idea è buona.
Vasil Popov,

1
Questa risposta non riesce ad accogliere i roll over del mese, quindi il 31 gennaio più un mese dà 2 o 3 marzo a seconda che si tratti di un anno bisestile o meno. Le funzioni addMonths e addYears nella risposta di Jacobi lo affrontano, quindi per me è una risposta migliore.
RobG

1
@RobG buon punto. Ho aggiunto una correzione per questo e ho ulteriormente enfatizzato il punto "usa una libreria se possibile".
Kip

238
var d1 = new Date ();
var d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );

114
@Jamie: non hai bisogno di due Dateoggetti. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner,

15
@Grant: ho assunto d2 = "Vorrei ottenere un oggetto Date" e d1 = "a un altro oggetto Date"
Jamie,

7
@CKeene, setMinutes & getMinutes fanno parte del semplice Javascript vecchio (sebbene datejs fornisca un sacco di altre cose).
S29,

4
Cordiali saluti, questo può oltrepassare i confini dell'ora legale. Demo di JSFiddle: "spring forward" / "fall back" (Grazie @Spig per questo)
Kip

@trevorgrayson Se un parametro specificato non rientra nell'intervallo previsto, setMinutes () tenta di aggiornare le informazioni sulla data di conseguenza. Ad esempio, se si utilizza 100, le ore verranno incrementate di 1 e 40 verranno utilizzate per minuti.
Mihai Crăiță,

155

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


3
Si noti che setTimerestituisce un timestamp numerico millisecondo, non un oggetto data. (Non pensare di poter fare un one-liner.)
Alan H.

12
var in30Mins = new Date(+new Date() + 1.8e6)è una linea singola, ma non sono sicuro che sia meglio di una linea doppia. ;-)
RobG

112

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


9
Ho notato che ne ho pubblicato un duplicato. Eliminato e fatto +1 invece.
Izzy,

3
risposta più semplice per questa domanda
vijay

Penso che setMinutesrestituisca il timestamp, ma nowrimanga l' Dateoggetto, quindi now = new Date(now)è obsoleto
p.boiko il

46

Forse qualcosa del genere?

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

console.log(v)


6
@ Chacha102: non hai bisogno di due Dateoggetti. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner,

12
Voleva due oggetti per la data. Leggi la domanda Un oggetto Date che è 30 minuti avanti rispetto a un altro oggetto Date.
Tyler Carter,

5
Funziona bene se passa oltre l'ora? Quindi, se lo chiamo alle 11:59, pianifica ok alle 12:29?
Chris Rae,

1
@ChrisRae sì, lo fa. 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

Creo sempre 7 funzioni, per lavorare con la data in JS: addSeconds, addMinutes, addHours, addDays, addWeeks, addMonths, addYears.

Puoi vedere un esempio qui: http://jsfiddle.net/tiagoajacobi/YHA8x/

Come usare:

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

Queste sono le funzioni:

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

Qualcuno può vedere qualche problema con questo approccio?
Il Dembinski il

1
usa moment.js invece
Victor Pudeyev il

@ TheDembinski: quali problemi ti aspetti? L'estensione degli incorporamenti non è generalmente gradita, ma non riesco a vedere un problema con Date. Sarebbe bello se ogni incremento maggiore impostasse facoltativamente anche i suoi incrementi minori (come fanno i metodi set * ), quindi addHours opzionalmente ha impiegato minuti, secondi e millisecondi in modo da poter date.addHours(3, 30)aggiungere 3 ore e 30 minuti. addYears richiederebbe anni, mesi e giorni, addMonths richiederebbe mesi e giorni, addMinutes richiederebbe minuti, secondi, millisecondi, ecc.
RobG

1
Ciao @transformer Vorrei fare qualcosa del genere new Date().addHours(4).addMinutes(45);Puoi chiamarne quanti ne vuoi, perché i metodi restituiscono "questo" che è l'oggetto data corrente.
Jacobi,

1
Ciao @transformer, non sono sicuro di aver capito il tuo problema, ma queste sono funzioni prototipo, puoi usarle nell'ordine che preferisci, es: var dt = new Date();allora dt.addMinutes(45); dt.addHours(4);o anche dt.addMinutes(285);o anche dt.addMinutes(45).addHours(4);tutto funzionerà. Se hai una domanda con qualche esempio di codice, per il tuo problema pubblicalo qui sarò felice di aiutarti.
Jacobi,

13

Il modo più semplice per risolvere è riconoscere che in javascript le date sono solo numeri. Inizia 0o 'Wed Dec 31 1969 18:00:00 GMT-0600 (CST). Ogni 1rappresenta un millisecondo. È possibile aggiungere o sottrarre millisecondi ottenendo il valore e creando un'istanza di una nuova data utilizzando quel valore. Puoi gestirlo abbastanza facilmente con quella mente.

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)

10

Questo è quello che faccio, che sembra funzionare abbastanza bene:

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

Quindi puoi semplicemente chiamarlo così:

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

2
Potresti semplicemente farlo return new Date(this.getTime() + minutes * 60000);, io il copiato temporaneo Data non è necessario. ;-)
RobG

5

Ecco la versione ES6 :

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

Chiamalo come:

getTimeAfter30Mins();

Ho utenti che inseriscono 4:30 h + 2:15 h / min, come posso consentire agli utenti di passare ore e minuti e aggiungerlo a un orario esistente min.
trasformatore

@transformer puoi fornire diversi campi di input per ore, minuti e così via con convalide numeriche.
xameeramir,

5

Sento che molte delle risposte qui mancano di una componente creativa, molto necessaria per i calcoli dei viaggi nel tempo. Vi presento la mia soluzione per una traduzione temporale di 30 minuti.

(jsfiddle qui )

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]());
}

Devo ammettere che questo è creativo. Ma amico ... Questo è difficile da leggere!
Erik Baan,

2

Per i pigri come me:

La risposta di Kip (dall'alto) in coffeescript, usando un "enum", e operando sullo stesso oggetto:

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

2

Utilizzare una libreria esistente nota per gestire le stranezze coinvolte nella gestione dei calcoli temporali. Il mio preferito attuale è 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>

3
Le risposte non possono migliorare se si annota il voto senza fornire una motivazione.
Ouroborus,

L'OP ha richiesto una soluzione JavaScript, non un framework / libreria.
mattpark22,

2
@ mattpark22 Mentre capisco cosa stai ottenendo, una libreria javascript è ancora javascript. Potrei estrarre solo i pezzi rilevanti della libreria e presentarli come una soluzione di codice. OP avrebbe una risposta javascript, nel senso che intendi, ma non sarebbe a conoscenza di una soluzione (possibilmente) accettabile, per scopi generali. Inoltre, aggiungere 30 minuti non è così banale in quanto la maggior parte delle risposte lo fanno sembrare, poiché ci sono molti casi limite non gestiti dall'oggetto Date. Ad esempio, la risposta più popolare si interrompe quando si attraversano i confini dell'ora legale.
Ouroborus

@ Ouroborus: le librerie non dovrebbero essere l'unica soluzione fornita se l'OP non ha richiesto una libreria nell'OP o nei tag. Altrimenti, le risposte possono diventare solo una litania di modi per fare qualcosa in diverse librerie e l'OP non viene lasciato più saggio al loro vero problema (che in questo caso è abbastanza banale da risolvere).
RobG

1
@RobG Nessuno suggerisce che dovrebbero essere fornite solo soluzioni di libreria. OP non può richiedere specificamente una biblioteca poiché ciò causerebbe la fuori tema della domanda. Chiedere "Come si fa con JavaScript?" potrebbe essere interpretato nel senso che questo è specifico per javascript (chiedere una soluzione in un linguaggio specifico invece di chiedere una soluzione di codice non elaborato) soprattutto dato che questo dettaglio è ripetuto nel titolo e nei tag.
Ouroborus,

1

Solo un'altra opzione, che ho scritto:

DP_DateExtensions Library

È eccessivo se questa è tutta l'elaborazione della data di cui hai bisogno, ma farà quello che vuoi.

Supporta la formattazione di data / ora, la matematica della data (aggiungi / sottrai parti della data), il confronto delle date, l'analisi della data, ecc. È liberamente disponibile.


1

Potresti farlo:

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



1

Dovresti ottenere il valore della data corrente per ottenere la data con (ms) e aggiungere (30 * 60 * 1000) ad essa. Ora hai (data corrente + 30 min) con ms

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


0

So che l'argomento è troppo vecchio. Ma sono abbastanza sicuro che ci siano alcuni sviluppatori che hanno ancora bisogno di questo, quindi ho realizzato questo semplice script per te. Spero che vi piaccia!

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>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.