Estoy tratando de obtener tiempos de ranuras disponibles. Tengo startDateTime , endDateTime , duration y bufferBetweenSlots en mi base de datos. con algunos cálculos he averiguado el número de espacios disponibles.
el valor de los campos son:
startDateTime: 8/20/2021 11:30 AM endDateTime: 8/20/2021 9:30 PM duration: 60 bufferBetweenSlots: 30 pero no estoy seguro de cómo obtener la hora de inicio y finalización de los espacios disponibles. por ejemplo 10:00 - 11:00
const getTimeDiffInMins = (endTime, startTime) => (+new Date(endTime) - +new Date(startTime)) / (60 * 1000); const getMultipleTimeSlots = (data) => { const diff = getTimeDiffInMins(data.end_date_time, data.start_date_time); const totalSlots = diff / data.duration; const totalBuffer = data.buffer_between_slots * totalSlots; const availableSlots = (diff - totalBuffer) / 60; return availableSlots; };¿alguna sugerencia?
Solo debería necesitar un búfer entre ranuras, por lo que el número de búferes es uno menos que el número de ranuras, es decir, desea resolver:
n * slotTime + (n - 1) * bufferTime == totalTimetal que:
totalTime <= diff Puede hacerlo agregando el búfer a totalTime y dividiendo por slotTime + bufferTime , luego nivelando el resultado para obtener el número total de espacios disponibles más los búferes. Luego puede simplemente iterar para producir la hora de inicio y finalización requerida. P.ej
let startDateTime = new Date(2021,7,8,11,30); // 20 Aug 2021 11:30 let endDateTime = new Date(2021,7,8,22); // 20 Aug 2021 22:00 let duration = 60; // minutes let bufferBetweenSlots = 30; // minutes let diff = (endDateTime - startDateTime) / 6e4; // minutes let numberOfSlots = Math.floor((diff + bufferBetweenSlots) / (duration + bufferBetweenSlots)); // minutes let slots = []; let time = new Date(startDateTime); for (let i = 0; i < numberOfSlots; i++) { // Add the slot start time slots[i] = {start: time.toString()}; // Increment time to end of slot time.setMinutes(time.getMinutes() + duration); // Add the end time slots[i].end = time.toString(); // Increment time to end of buffer time.setMinutes(time.getMinutes() + bufferBetweenSlots); } console.log(slots);Cambié la hora de finalización a las 22:00 para mostrar que solo se llenan las franjas horarias. Depende de usted si inserta marcas de tiempo o objetos de fecha en la matriz de ranuras . Solo recuerde, si agrega fechas, copie la fecha como:
slots[i] = {start: new Date(+time)}; ... slots[i].end = new Date(+time);Gracias @RobG por tomarse el tiempo para responder. así es como me las arreglé para slove it.
const getTimeDiffInMins = (endTime, startTime) => (+new Date(endTime) - +new Date(startTime)) / (60 * 1000); const convertToMilliSecs = (value) => value * 60 * 1000; // coming from the db const data = { duration: 60, buffer_between_slots: 30, start_date_time: '2021-08-20T10:30:00Z', end_date_time: '2021-08-20T20:30:00Z', }; const { duration: a, buffer_between_slots: b, end_date_time: x, start_date_time: y, } = data; const duration = getTimeDiffInMins(x, y); const slotDuration = a; const totalSlots = a + b; const numberOfSlots = Math.floor(duration / totalSlots); const slotsAvailable = [...Array(numberOfSlots).keys()].map((slotNumber) => { const slotStart = (slotNumber - 1) * totalSlots; const slotEnd = slotStart + slotDuration; return { start: +new Date(y) + convertToMilliSecs(slotStart), end: +new Date(y) + convertToMilliSecs(slotEnd), }; }); /* Now we can format the time however we want I'm using momentjs: moment(new Date(slot.start)).format('h:mma') */ console.log(slotsAvailable);