¿Cómo restar minutos de una fecha en javascript?

133

¿Cómo puedo traducir este pseudocódigo en js de trabajo?

var myEndDateTime = somedate;  //somedate is a valid js date  
var durationInMinutes = 100; //this can be any number of minutes from 1-7200 (5 days)

//this is the calculation I don't know how to do
var myStartDate = somedate - durationInMuntes;

alert("The event will start on " + myStartDate.toDateString() + " at " + myStartDate.toTimeString());
Brendan
fuente

Respuestas:

199

Una vez que sepas esto:

  • Puede crear un Datellamando al constructor con milisegundos desde el 1 de enero de 1970.
  • El valueOf()aDate es el número de milisegundos desde 01 de enero 1970
  • Hay 60,000milisegundos en un minuto: -]

... no es tan difícil.

En el siguiente código, Datese crea un nuevo restando el número apropiado de milisegundos de myEndDateTime:

var MS_PER_MINUTE = 60000;
var myStartDate = new Date(myEndDateTime - durationInMinutes * MS_PER_MINUTE);
Daniel LeCheminant
fuente
66
Pero no se maneja cuando agrega minutos. Para manejar correctamente cuando agrega minutos, debe usar .getTime(). Ejemplo:var myStartDate = new Date(myEndDateTime.getTime() + durationInMinutes * MS_PER_MINUTE);
Gabriel L. Oliveira
También puede usar var myStartDate = somedate.addMinutes(-durationInMuntes);Supongo que somedate es un objeto Date
kubahaha
1
Funciona ... pero tengo una pregunta de que el constructor Date () tiene 3 opciones, es decir, 1: vacío 2: cadena y 3: Número año, Número Mes ... entonces, ¿el constructor que sigue arriba sigue qué constructor?
Zafar
3
Más programadores de falsedades creen en el tiempo, # 32 "Hay 60 segundos en cada minuto".
Niet the Dark Absol
Para un ejemplo de cómo esto puede ir mal, usando Europa / Londres como la configuración regional zona horaria: var d = new Date("2017-10-29 01:50:00"), e = new Date(d.getTime() + 20 * 60000);se puede esperar ea ser 02:10:00, ¿verdad? No 01:10:00. DST dice hola. Y luego están los segundos de salto ...
Niet the Dark Absol
81

También puede usar get y set minutes para lograrlo:

var endDate = somedate;

var startdate = new Date(endDate);

var durationInMinutes = 20;

startdate.setMinutes(endDate.getMinutes() - durationInMinutes);
Miquel
fuente
52
Vale la pena señalar que setMinutes()es lo suficientemente inteligente como para manejar correctamente los minutos negativos. Entonces, si la fecha de inicio fue 3:05 y desea restar 30 minutos, pasaría -25a setMinutes (), que es lo suficientemente inteligente como para saber que 3:-25es así 2:35. (es decir, no arroja una excepción).
Kip
2
@Kip - Gracias, esa es la idea que hace que esta respuesta valga la pena. ¿Pero todos los navegadores lo garantizan? Pregunto porque MDN dice que solo se permiten de 0 a 59, pero sospecho que los documentos simplemente están equivocados en este caso. Ver: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Justin Ethier el
Esto fue más útil para mí, quería restar el tiempo de una instancia de objeto Date existente que se configuró de una manera particular a través del constructor. ¡Gracias!
Bill Effin Murray
1
Solo recuerda que la .setMinutes(...)fuerza maneja los intvalores. Si se configura 1.5 minutesen un Datesolo se configurará 1 minutey mantendrá los segundos igual que antes.
Gabriel L. Oliveira
Estaba obteniendo valores incorrectos en un caso de uso similar cuando intenté startDate = endDate. Parece el problema donde ocurre una copia superficial
raghav710
35

Todo es solo un tic, no es necesario memorizar métodos ...

var aMinuteAgo = new Date( Date.now() - 1000 * 60 );

o

var aMinuteLess = new Date( someDate.getTime() - 1000 * 60 );

actualizar

Después de trabajar con momentjs, debo decir que esta es una biblioteca increíble que deberías visitar. Es cierto que los ticks funcionan en muchos casos haciendo que su código sea muy pequeño y debe intentar que su código sea lo más pequeño posible para lo que necesita hacer. Pero para cualquier cosa complicada, usa momentjs.

Jason Sebring
fuente
2
OMI, esto no es tan simple. Se necesita un cierto esfuerzo para descifrar lo que realmente hace este código. El mejor enfoque es envolver ese tipo de lógica en una función.
sszarek
12

moment.js tiene algunos métodos de conveniencia realmente buenos para manipular objetos de fecha

El método .subtract le permite restar una cierta cantidad de unidades de tiempo de una fecha, proporcionando la cantidad y una cadena de unidad de tiempo.

var now = new Date();
// Sun Jan 22 2017 17:12:18 GMT+0200 ...
var olderDate = moment(now).subtract(3, 'minutes').toDate();
// Sun Jan 22 2017 17:09:18 GMT+0200 ...
svarog
fuente
6

Esto es lo que encontré:

//First, start with a particular time
var date = new Date();

//Add two hours
var dd = date.setHours(date.getHours() + 2);

//Go back 3 days
var dd = date.setDate(date.getDate() - 3);

//One minute ago...
var dd = date.setMinutes(date.getMinutes() - 1);

//Display the date:
var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var date = new Date(dd);
var day = date.getDate();
var monthIndex = date.getMonth();
var year = date.getFullYear();
var displayDate = monthNames[monthIndex] + ' ' + day + ', ' + year;
alert('Date is now: ' + displayDate);

Fuentes:

http://www.javascriptcookbook.com/article/Perform-date-manipulations-based-on-adding-or-subtracting-time/

https://stackoverflow.com/a/12798270/1873386

choque
fuente
5
var date=new Date();

//here I am using "-30" to subtract 30 minutes from the current time.
var minute=date.setMinutes(date.getMinutes()-30); 

console.log(minute) //it will print the time and date according to the above condition in Unix-timestamp format.

puede convertir la marca de tiempo de Unix a la hora convencional utilizando, por new Date()ejemplo.

var extract=new Date(minute)
console.log(minute)//this will print the time in the readable format.
Rajesh Vinay Kumar
fuente
He realizado algunos cambios de formato. Asegúrate de que aún refleje lo que pretendías publicar.
adiga
1

Intenta lo siguiente:

var dt = new Date();
dt.setMinutes( dt.getMinutes() - 20 );
console.log('#####',dt);
Jitendra
fuente
0

Esto es lo que hice: ver en Codepen

var somedate = 1473888180593;
var myStartDate;
//var myStartDate = somedate - durationInMuntes;

myStartDate = new Date(dateAfterSubtracted('minutes', 100));

alert("The event will start on " + myStartDate.toDateString() + " at " + myStartDate.toTimeString());

function dateAfterSubtracted(range, amount){
    var now = new Date();
    if(range === 'years'){
        return now.setDate(now.getYear() - amount);
    }
    if(range === 'months'){
        return now.setDate(now.getMonth() - amount);
    }
    if(range === 'days'){
        return now.setDate(now.getDate() - amount);
    }
    if(range === 'hours'){
        return now.setDate(now.getHours() - amount);
    }
    if(range === 'minutes'){
        return now.setDate(now.getMinutes() - amount);
    }
    else {
        return null;
    }
}
Ronnie Royston
fuente
OP no usa new Date(), pero tiene una fecha específica, y solo preguntó sobre restar minutos. Además, su código no funciona: devuelve la marca de tiempo UNIX en lugar del objeto Date.
Michał Perłakowski
0

Amplíe la clase de fecha con esta función

// Add (or substract if value is negative) the value, expresed in timeUnit
// to the date and return the new date.
Date.dateAdd = function(currentDate, value, timeUnit) {

    timeUnit = timeUnit.toLowerCase();
    var multiplyBy = { w:604800000,
                     d:86400000,
                     h:3600000,
                     m:60000,
                     s:1000 };
    var updatedDate = new Date(currentDate.getTime() + multiplyBy[timeUnit] * value);

    return updatedDate;
};

Por lo tanto, puede agregar o restar una cantidad de minutos, segundos, horas, días ... a cualquier fecha.

add_10_minutes_to_current_date = Date.dateAdd( Date(), 10, "m");
subs_1_hour_to_a_date = Date.dateAdd( date_value, -1, "h");
Gonzalo Cao
fuente