Necesito generar una cantidad variable de rangos entre un día según la cantidad de minutos para compararlos con una lista de archivos para ver si hay una brecha en los datos.
Por ejemplo, si el intervalo de minutos es 60*12 (medio día), necesitaría generar la siguiente lista:
['00:00_12:00','12:00_00:00']Si el intervalo de minutos es 5:
['00:00_00:05', '00:05_00:10',..................., '23:55_00:00']Estoy tratando de usar la biblioteca de momentos para simplificar la tarea, supongo que usando
moment(date).add(interval, 'minutes').format('HH:MM');Pero no puedo encontrar el bucle correcto para obtener el resultado deseado.
Este es mi código actual, pero ni siquiera funciona:
var interval_1 = 60; var interval_2 = 5; var interval_3 = 60*12; var today = moment.utc(new Date()).startOf('day').toISOString(); console.log(today) from = moment.utc(new Date()).startOf('day').format('HH:MM') var to = '' while (to !== '00:00'){ to = moment(from).add(interval_1, 'minutes').format('HH:MM'); console.log(from, '_', to, '.json') from = to }Creo que el formateo que debe hacer en cada combinación de horas y minutos es lo suficientemente simple como para que no necesite obtener una biblioteca para ello. Así es como podría hacer esto:
const formatMinutes = (m) => String (((m - (m % 60)) / 60 % 24)) .padStart (2, '0') + ':' + String (m % 60) .padStart (2, '0') const divideDay = (n) => Array .from ( {length: 24 * 60 / n}, (_, i) => [i * n, (i + 1) * n] ).map (([b, e]) => `${formatMinutes (b)}_${formatMinutes (e)}`) const testCases = [327, 60, 5, 60 * 12] testCases .forEach ( minutes => console .log (`${minutes} minutes: ["${divideDay (minutes) .join('", "')}"]\n`) ) .as-console-wrapper {max-height: 100% !important; top: 0} formatMinutes toma una cantidad de minutos y lo formatea en formato hh:mm , rellenando a la izquierda cada componente con 0 si es necesario. La función principal es divideDay , que divide los minutos en matrices [[0, 5], [5, 10], ... [1435, 1440]] y luego asigna estos pares de inicio y fin en una cadena formateada llamando a formatMinutes en cada uno.
Si quiere lidiar con posibles parciales, si por ejemplo pasa 327 como el número de minutos, al capturar el minuto restante en una sección final, puede cambiarlo un poco así:
const divideDay = (n) => Array .from ( {length: Math .ceil (24 * 60 / n)}, (_, i) => [i * n, Math .min ((i + 1) * n, 24 * 60)] ).map (([b, e]) => `${formatMinutes (b)}_${formatMinutes (e)}`)y entonces
divideDay (327) //=> ['00:00_05:27', '05:27_10:54', '10:54_16:21', '16:21_21:48']