Me gustaría obtener un objeto Date que sea 30 minutos más tarde que otro objeto Date. ¿Cómo lo hago con JavaScript?
fuente
Me gustaría obtener un objeto Date que sea 30 minutos más tarde que otro objeto Date. ¿Cómo lo hago con JavaScript?
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();
Esto es como la respuesta del caos , pero en una línea:
var newDateObj = new Date(oldDateObj.getTime() + diff*60000);
¿Dónde diff
está la diferencia en minutos que quieres del oldDateObj
tiempo? 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 60000
es para convertir los minutos a milisegundos.
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;
}
var d1 = new Date ();
var d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );
Date
objetos. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
var oldDateObj = new Date();
var newDateObj = new Date();
newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000));
console.log(newDateObj);
setTime
devuelve una marca de tiempo numérica de milisegundos, no un objeto de fecha. (No piense que puede hacer una frase).
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. ;-)
var now = new Date();
now.setMinutes(now.getMinutes() + 30); // timestamp
now = new Date(now); // Date object
console.log(now);
setMinutes
devuelve la marca de tiempo, pero now
sigue siendo el Date
objeto, por lo que now = new Date(now)
es obsoleto
Tal vez algo como esto?
var d = new Date();
var v = new Date();
v.setMinutes(d.getMinutes()+30);
console.log(v)
Date
objetos. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
If a parameter you specify is outside of the expected range, setMinutes() attempts to update the date information in the Date object accordingly.
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;
};
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.
new Date().addHours(4).addMinutes(45);
Puedes llamar tantos como quieras, porque los métodos devuelven "this", que es el objeto de fecha actual.
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é
La forma más fácil de resolver es reconocer que en javascript las fechas son solo números. Comienza 0
o 'Wed Dec 31 1969 18:00:00 GMT-0600 (CST)
. Cada 1
representa 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)
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));
return new Date(this.getTime() + minutes * 60000);
, yo, la fecha provisional copiada no es necesaria. ;-)
Aquí está la versión ES6 :
let getTimeAfter30Mins = () => {
let timeAfter30Mins = new Date();
timeAfter30Mins = new Date(timeAfter30Mins.setMinutes(timeAfter30Mins.getMinutes() + 30));
};
Llámalo como:
getTimeAfter30Mins();
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]());
}
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
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>
Solo otra opción, que escribí:
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.
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);
Aquí está mi frase:
console.log('time: ', new Date(new Date().valueOf() + 60000))
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)))
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>
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);
d
ahora es 30 minutos antes, no más tarde quef
.f
yd
verá que uno dice "GMT-0500" y el otro dice "GMT-0400" (o cualquiera que sea su zona horaria). Además, si llama.getTime()
a ambosf
yd
verá quef
es más grande qued
(es decir, más tarde).01:89
se convertiría en algo02:29
que no existe el día en que "avanzas". Chrome decide que debería ser01:29
, FF decide03:29
. En la noche en la que "retrocede", ambos navegadores omiten la hora de "retroceso" y saltan 90 minutos hacia adelante02:29
. Aquí hay algunas demostraciones de JSFiddle: "spring forward" / "fall back"