¿Cómo agregar 30 minutos a un objeto de fecha de JavaScript?

785

Me gustaría obtener un objeto Date que sea 30 minutos más tarde que otro objeto Date. ¿Cómo lo hago con JavaScript?

Morgan Cheng
fuente
1
Creé un pequeño script emergente de calendario en js, está en Github , tal vez mire a través del código para ver cómo se interactúa con el objeto de fecha. Además, verifique el Kit Javascript como una referencia js increíble, especialmente para el objeto de fecha.
Christian el
2
Todas las respuestas a continuación que usan una variación de date.setMinutes(date.getMinutes() + ...)fallarán al cruzar los límites del horario de verano. Por ejemplo (suponiendo que '2014-03-09' es un límite de horario de verano): var d = new Date('2014-03-09 01:59:00'), f = new Date(d.getTime()); d.setMinutes(d.getMinutes() + 30); dahora es 30 minutos antes, no más tarde que f.
Spig
1
@Spig: 30 minutos después de la 1:59 a.m.en el límite del horario de verano es 1:29 a.m. No hay error Si imprime fy dverá que uno dice "GMT-0500" y el otro dice "GMT-0400" (o cualquiera que sea su zona horaria). Además, si llama .getTime()a ambos fy dverá que fes más grande que d(es decir, más tarde).
Kip
1
@Spig: interesante, lo probé en Firefox y funcionó. Creo que cae en un área gris en la especificación de cómo debería funcionar getMinutes (). 01:89se convertiría en algo 02:29que no existe el día en que "avanzas". Chrome decide que debería ser 01:29, FF decide 03:29. En la noche en la que "retrocede", ambos navegadores omiten la hora de "retroceso" y saltan 90 minutos hacia adelante 02:29. Aquí hay algunas demostraciones de JSFiddle: "spring forward" / "fall back"
Kip
1
Si una de las respuestas a continuación responde a su pregunta, la forma en que funciona este sitio funciona, "aceptaría" la respuesta, más aquí: ¿Qué debo hacer cuando alguien responde mi pregunta? . Pero solo si su pregunta realmente ha sido respondida. Si no, considere agregar más detalles a la pregunta.
Goodbye StackExchange

Respuestas:

952

Usando una biblioteca

Si está haciendo mucho trabajo de fechas, es posible que desee buscar en bibliotecas de fechas de JavaScript como Datejs o Moment.js . Por ejemplo, con Moment.js, esto es simplemente:

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

Javascript vainilla

Esto es como la respuesta del caos , pero en una línea:

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

¿Dónde diffestá la diferencia en minutos que quieres del oldDateObjtiempo? Incluso puede ser negativo.

O como una función reutilizable, si necesita hacer esto en varios lugares:

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

Y en caso de que esto no sea obvio, la razón por la que multiplicamos los minutos 60000es para convertir los minutos a milisegundos.

Tenga cuidado con Javascript de vainilla. ¡Las fechas son difíciles!

Puede pensar que puede agregar 24 horas a una fecha para obtener la fecha de mañana, ¿verdad? ¡Incorrecto!

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

Resulta que si el usuario observa el horario de verano, un día no necesariamente dura 24 horas. Hay un día al año que dura solo 23 horas y un día al año que dura 25 horas. Por ejemplo, en la mayoría de los Estados Unidos y Canadá, 24 horas después de la medianoche, el 2 de noviembre de 2014, todavía es el 2 de noviembre:

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!

Es por eso que usar una de las bibliotecas mencionadas anteriormente es una apuesta más segura si tiene que trabajar mucho con esto.

A continuación hay una versión más genérica de esta función que escribí. Todavía recomiendo usar una biblioteca, pero eso puede ser excesivo / imposible para su proyecto. La sintaxis se basa en la función MySQL DATE_ADD .

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

Trabajando jsFiddle demo .

Dormir
fuente
14
Esto es muy poderoso; Funciona por cualquier cantidad de minutos, incluso si el número fue negativo.
Wahid Bitar
3
Por segundos, multiplique por 1000 en lugar de 60k.
cenizas999
2
¡La función dateAdd () es genial! Pero hay una nota mía: semánticamente, la unidad debe ser "minuto", "segundo", etc. y el intervalo debe ser la cantidad (2, 10, 45, ...), no viceversa. De lo contrario, la idea es buena.
Vasil Popov
1
Esta respuesta no puede acomodar las renovaciones mensuales, por lo que el 31 de enero más un mes da 2 o 3 de marzo, dependiendo de si es un año bisiesto o no. Las funciones addMonths y addYears en la respuesta de Jacobi se ocupan de eso, así que para mí, es una mejor respuesta.
RobG
1
@RobG Buen punto. Agregué una solución para esto y enfaticé aún más el punto "usar una biblioteca si es posible".
Kip
238
var d1 = new Date ();
var d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );
Jamie
fuente
114
@Jamie: No necesitas dos Dateobjetos. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner el
15
@Grant: Asumí d2 = "Me gustaría conseguir un objeto Date" y d1 = "a otro objeto Date"
Jamie
77
@CKeene, setMinutes y getMinutes son parte de Javascript antiguo (aunque datejs proporciona muchas otras cosas).
s29
44
FYI- esto puede romper los límites del horario de verano. Demostraciones de JSFiddle: "spring forward" / "fall back" (Gracias @Spig por esto)
Kip
@trevorgrayson Si un parámetro que especifica está fuera del rango esperado, setMinutes () intenta actualizar la información de la fecha en consecuencia. Por ejemplo, si usa 100, las horas se incrementarán en 1 y 40 se usarán por minutos.
Mihai Crăiță
156

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

caos
fuente
3
Tenga en cuenta que setTimedevuelve una marca de tiempo numérica de milisegundos, no un objeto de fecha. (No piense que puede hacer una frase).
Alan H.
12
var in30Mins = new Date(+new Date() + 1.8e6)es de una sola línea, pero no estoy seguro de que sea mejor que una de dos líneas. ;-)
RobG
112

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

Teo Graca
fuente
99
Noté que publiqué un duplicado de esto. Eliminado y hecho +1 en su lugar.
Izzy
3
respuesta más simple para esta pregunta
vijay
Creo que setMinutesdevuelve la marca de tiempo, pero nowsigue siendo el Dateobjeto, por lo que now = new Date(now)es obsoleto
p.boiko
46

Tal vez algo como esto?

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

console.log(v)

Tyler Carter
fuente
66
@ Chacha102: No necesitas dos Dateobjetos. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner el
12
Quería dos objetos de fecha. Lea la pregunta. Un objeto de fecha que está 30 minutos por delante de otro objeto de fecha.
Tyler Carter el
55
¿Funciona bien si pasa la hora? Entonces, si lo llamo a las 11:59, ¿se programa bien a las 12:29?
Chris Rae
1
@ ChrisRae sí, lo hace. 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

Siempre creo 7 funciones, para trabajar con fecha en JS: addSeconds, addMinutes, addHours, addDays, addWeeks, addMonths, addYears.

Puedes ver un ejemplo aquí: http://jsfiddle.net/tiagoajacobi/YHA8x/

Cómo utilizar:

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

Estas son las funciones:

        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
fuente
¿Alguien puede ver algún problema con este enfoque?
The Dembinski
1
use moment.js en su lugar
Victor Pudeyev
@ TheDembinski: ¿qué problemas espera? Por lo general, no le gusta extender los elementos integrados, pero no puedo ver un problema con Date. Sería bueno si cada incremento principal también estableciera opcionalmente sus incrementos menores (como lo hacen los métodos set * ), por lo que addHours opcionalmente tomó minutos, segundos y milisegundos para que pueda date.addHours(3, 30)agregar 3 horas y 30 minutos. addYears tomaría años, meses y días, addMonths tomaría meses y días, addMinutes tomaría minutos, segundos, milisegundos, etc.
RobG
1
Hola @transformer, haría algo como esto. new Date().addHours(4).addMinutes(45);Puedes llamar tantos como quieras, porque los métodos devuelven "this", que es el objeto de fecha actual.
Jacobi
1
Hola @transformer, no estoy seguro de haber entendido tu problema, pero estas son funciones prototipo, puedes usarlas en el orden que desees, por ejemplo: var dt = new Date();entonces dt.addMinutes(45); dt.addHours(4);o incluso dt.addMinutes(285);o dt.addMinutes(45).addHours(4);todo funcionará. Si tiene una pregunta con algún ejemplo de código, para su problema publíquelo aquí, con gusto lo ayudaré
Jacobi
13

La forma más fácil de resolver es reconocer que en javascript las fechas son solo números. Comienza 0o 'Wed Dec 31 1969 18:00:00 GMT-0600 (CST). Cada 1representa un milisegundo. Puede sumar o restar milisegundos obteniendo el valor e instanciando una nueva fecha usando ese valor. Puedes manejarlo con bastante facilidad con esa 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)
tsacodes
fuente
10

Esto es lo que hago, que parece funcionar bastante bien:

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

Entonces puedes llamar a esto así:

var now = new Date();
console.log(now.addMinutes(50));
Jonathan
fuente
2
Podrías hacerlo return new Date(this.getTime() + minutes * 60000);, yo, la fecha provisional copiada no es necesaria. ;-)
RobG
5

Aquí está la versión ES6 :

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

Llámalo como:

getTimeAfter30Mins();
xameeramir
fuente
Tengo usuarios que ingresan 4:30 hr + 2:15 hrs / min, ¿cómo puedo dejar que los usuarios pasen horas y minutos y agregarlos a las horas min existentes?
transformador
@transformer puede proporcionar diferentes campos de entrada para horas, minutos, etc., con validaciones de números.
xameeramir
5

Siento que muchas de las respuestas aquí carecen de un componente creativo, muy necesario para los cálculos de viajes en el tiempo. Presento mi solución para una traducción temporal de 30 minutos.

(jsfiddle aquí )

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]());
}
no sincronizado
fuente
Tengo que admitir que esto es creativo. Pero hombre ... ¡Esto es difícil de leer!
Erik Baan
2

Para los perezosos como yo:

La respuesta de Kip (desde arriba) en coffeescript, usando una "enumeración", y operando en el mismo objeto:

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
fuente
2

Use una biblioteca existente conocida para manejar las peculiaridades involucradas en el manejo de los cálculos de tiempo. Mi favorito actual es 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
fuente
3
Las respuestas no pueden mejorar si vota negativamente sin dar una razón.
Ouroborus
El OP solicitó una solución de JavaScript, no un marco / biblioteca.
mattpark22
2
@ mattpark22 Si bien entiendo a lo que te refieres, una biblioteca javascript sigue siendo javascript. Podría extraer solo las piezas relevantes de la biblioteca y presentarlas como una solución de código. OP tendría una respuesta que fuera javascript, en el sentido de que lo dices en serio, pero desconocería una (posiblemente) solución de propósito general aceptable. Además, agregar 30 minutos no es tan trivial como la mayoría de las respuestas lo hacen sonar, ya que hay muchos casos extremos no manejados por el objeto Date. Por ejemplo, la respuesta más popular se interrumpe al cruzar los límites del horario de verano.
Ouroborus
@ Ouroborus: las bibliotecas no deberían ser la única solución proporcionada si el OP no ha pedido una biblioteca en el OP o en las etiquetas. De lo contrario, las respuestas pueden convertirse en una letanía de formas de hacer algo en diferentes bibliotecas y el OP no se deja más sabio para su problema real (que en este caso es bastante trivial de resolver).
RobG
1
@RobG Nadie sugiere que solo se proporcionen soluciones de biblioteca. OP no puede solicitar específicamente una biblioteca, ya que eso haría que la pregunta esté fuera de tema. Preguntando "¿Cómo lo hago con JavaScript?" podría interpretarse como la especificación de que esto es específico de javascript (pedir una solución en un idioma específico en lugar de pedir una solución de código sin formato) especialmente dado que este detalle se repite en el título y las etiquetas.
Ouroborus
1

Solo otra opción, que escribí:

Biblioteca DP_DateExtensions

Es excesivo si este es todo el procesamiento de fechas que necesita, pero hará lo que quiera.

Admite el formato de fecha / hora, matemática de fecha (partes de fecha de suma / resta), comparación de fecha, análisis de fecha, etc. Es de código abierto.

Jim Davis
fuente
1

Podrías hacer esto:

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

Aquí está mi frase:

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

Jason Mullings
fuente
1

Debe obtener el valor de la fecha actual para obtener la fecha con (ms) y agregarle (30 * 60 * 1000). Ahora tienes (fecha actual + 30 min) con ms

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

Abdulrahman Fawzy
fuente
0

Sé que el tema es demasiado viejo. Pero estoy bastante seguro de que hay algunos desarrolladores que aún necesitan esto, así que hice este simple script para ti. ¡Espero que lo disfruten!

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
fuente