Tengo un problema en el que no estoy seguro de cómo calcular si es una hora o menos entre una fecha de envío y la hora actual usando el objeto JS Date. lo que he hecho hasta ahora es convertir la cadena de entidad.dispatchDate en un objeto de fecha, sin embargo, este caso que he escrito hasta ahora devuelve verdadero siempre que el objeto de fecha de fecha de hoy sea igual o mayor que la fecha de envío. Lo que creo que tengo que hacer es, en primer lugar, no usar 1 hora sino minutos, ya que necesito dar cuenta de cada escenario que se encuentra dentro de esa hora, por ejemplo, si es una hora antes, 15 minutos o 30 minutos para regresar verdadero. Lo que he escrito hasta ahora:
// OPTIONS const hoursBeforeSendout = 1; // END OF OPTIONS if(!entity.dispatchDate) { return false; } var sendDate = new Date(Date.parse(entity.dispatchDate)); Date.prototype.addHours = function(h) { this.setTime(this.getTime() + (h*60*60*1000)); return this; } var todaysDate = new Date(); todaysDate.addHours(hoursBeforeSendout); if(todaysDate >= sendDate) { return true; } return false;Agradecería cualquier aporte aquí sobre cuál sería el mejor enfoque
Sugeriría simplemente restar la fecha actual (usando Date.now()) de la fecha de envío.
Si esto está por debajo de la duración del umbral, es 'vencido' o 'cerrado':
function isDispatchDateClose(dispatchDate, thresholdMs = 3600 * 1000) { if (!dispatchDate) { return false; } const timeToDispatchDateMilliseconds = Date.parse(dispatchDate) - Date.now(); return (timeToDispatchDateMilliseconds <= thresholdMs); } let dispatchDates = [0, 30, 45, 90, 120].map(offsetMinutes => new Date(Date.now() + offsetMinutes * 60000).toLocaleString('sv')); console.log('Dispatch Date', '\t\t', 'Is Close ( < 1 hr to go)'); for(let dispatchDate of dispatchDates) { console.log(dispatchDate, '\t', isDispatchDateClose(dispatchDate)) } .as-console-wrapper { max-height: 100% !important; top: 0; }Si todo lo que desea es saber si el valor de dispatchDate está dentro de (menos de) 1 hora a partir de ahora, hay algunas formas de hacerlo que son bastante simples.
El método más simple probablemente sería (actualizado según el comentario de RobG :
return new Date() - sendDate.getTime() >= 3600000;Dependiendo de si necesita o no flexibilidad adicional, también puede obtener el tiempo restante de diferentes formas y decidir qué hacer a partir de ahí:
// OPTIONS const hoursBeforeSendout = 1; // END OF OPTIONS if(!entity.dispatchDate) { return false; } var sendDate = new Date(Date.parse(entity.dispatchDate)); let _TimeRemaining = function(d) { let timeRemaining = Math.floor((d.getTime() - new Date().getTime()) / 1000); return {"hours": Math.floor(timeRemaining / 60 / 60), "minutes": Math.floor(timeRemaining / 60), "seconds": timeRemaining} } console.log(_TimeRemaining(sendDate)["hours"]); // returns the hours remaining console.log(_TimeRemaining(sendDate)["minutes"]); // returns the minutes remaining console.log(_TimeRemaining(sendDate)["seconds"]); // returns the seconds remaining return _TimeRemaining(sendDate)["hours"] <= 0; // returns true if less than 1 hour