2009-03-23 13 views
87

¿Cómo puedo traducir este pseudo código en js de trabajo [no se preocupe de dónde viene la fecha de finalización, excepto que es una fecha de javascript válida].¿Cómo restar minutos de una fecha en javascript?

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

Respuesta

149

vez que sepas esto:

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

... no es tan difícil.

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

var MS_PER_MINUTE = 60000; 
var myStartDate = new Date(myEndDateTime - durationInMinutes * MS_PER_MINUTE); 
+0

Esta solución maneja correctamente los minutos de "flotación". –

+2

Pero no se maneja cuando agrega minutos. Para manejar correctamente cuando agrega minutos, debe usar '.getTime()'. Ejemplo: 'myStartDate var = new Date (myEndDateTime.getTime() + durationInMinutes * MS_PER_MINUTE);' –

+0

También puede utilizar 'var = myStartDate somedate.addMinutes (-durationInMuntes);' Asumo somedate es un objeto Date – kubahaha

51

También puede utilizar obtener y establecer minutos para lograrlo:

var endDate = somedate; 

var startdate = new Date(endDate); 

var durationInMinutes = 20; 

startdate.setMinutes(endDate.getMinutes() - durationInMinutes); 
+32

Vale la pena señalar que 'setMinutes()' es lo suficientemente inteligente como para manejar los minutos negativos correctamente. Entonces, si la fecha de inicio era 3:05, y quieres restar 30 minutos, estarías pasando '-25' a setMinutes(), que es lo suficientemente inteligente como para saber que' 3: -25' es '2:35 '. (es decir, no arroja una excepción.) – Kip

+2

@Kip - Gracias, esa es la información que hace que esta respuesta valga la pena. Pero, ¿todos los navegadores lo garantizan? Lo pregunto porque MDN dice que solo se permiten 0 a 59, pero sospecho que los documentos son incorrectos en este caso. Ver: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/setMinutes –

+0

Esto fue más útil para mí, quise restar el tiempo de una instancia de objeto Date existente que se configuró en un particular camino a través del constructor. ¡Gracias! –

0

Esto es lo que hice: see on 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; 
    } 
} 
+0

OP no usa 'new Date()', pero tiene una fecha especificada, y solo se le pregunta sobre restar minutos. Además, su código no funciona: devuelve la marca de tiempo UNIX en lugar del objeto Date. –

+0

¿Es aceptable la respuesta actualizada? –

2

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

4

moment.js tiene algunos métodos de conveniencia agradables para manipular objetos

El método .subtract fecha, que permite para restar una cierta cantidad de unidades de tiempo de una fecha, por proporcionando la cantidad y una secuencia de timeunit.

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 ... 
6

todo está garrapatas, no hay necesidad de memorizar métodos ...

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

o

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

IMO esto no es tan simple. Se necesita un cierto esfuerzo para descifrar lo que hace realmente este código. El mejor enfoque es envolver ese tipo de lógica en una función. – sszarek

+0

@sszarek derecha. Bueno, el punto que estoy haciendo es educar y una función en frente de una línea pequeña no lo hará. Todo se reduce a ticks (milisegundos) de esta manera y no es necesario memorizar qué método de fecha hace lo que la especificación decide agregar o depreciar arbitrariamente. –

0

Extender la clase Date 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; 
}; 

Para que pueda 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"); 
-1
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 marca de tiempo Unix en el tiempo convencional mediante el uso de new Date().por ejemplo

var extract=new Date(minute) 
console.log(minute)//this will print the time in the readable format. 
+0

He realizado algunos cambios de formato. Por favor, asegúrese de que aún refleje lo que pretendía publicar. – adiga

Cuestiones relacionadas