Tengo una serie de meses:
const monthsArr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; También tengo dos fechas: 2021-09-07 y 2022-03-17 . Para obtener el número de meses entre estas fechas, uso la función:
function monthDiff(dateFrom, dateTo) { return dateTo.getMonth() - dateFrom.getMonth() + 12 * (dateTo.getFullYear() - dateFrom.getFullYear()); } ¿Cómo mostrar todos los meses de la matriz monthsArr entre esas dos fechas? Gracias de antemano por cualquier ayuda.
Puede que le resulte útil utilizar una biblioteca de utilidades como date-fns ( https://date-fns.org/ ), más específicamente la sub ( https://date-fns.org/v2.28.0/docs/sub )
Puede usar Array().fill() para generar los 12 meses para todos los años involucrados, aplanarlo y luego slice la parte relevante. Para asegurarse de que el segundo argumento de slice sea negativo (¡no cero!), incluso agregue 12 meses más a eso. El segundo argumento será entonces un valor entre -23 y -12:
const monthsArr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; function monthsBetween(dateFrom, dateTo) { return Array(dateTo.getFullYear() - dateFrom.getFullYear() + 2) .fill(monthsArr).flat() .slice(dateFrom.getMonth(), dateTo.getMonth() - 23); } let dateFrom = new Date("2021-09-07"); let dateTo = new Date("2022-03-17"); console.log(monthsBetween(dateFrom, dateTo));Un enfoque simplista es incrementar la fecha de inicio en un mes a la vez y devolver el valor en ese índice de la matriz. El único problema es determinar si "entre" incluye el mes de inicio y finalización o solo los que se encuentran entre esos meses.
Lo siguiente incluye los meses de inicio y finalización en el resultado:
let months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; function getMonthsBetweenDates(startDate, endDate) { // Make start as 1st of startDate month let s = new Date(startDate.getFullYear(), startDate.getMonth()); let result = []; // Loop over months until get to end month while (s <= endDate) { result.push(months[s.getMonth()]); s.setMonth(s.getMonth() + 1); } return result; } // Get months between 2021-09-07 and 2022-03-17 console.log(getMonthsBetweenDates(new Date(2021,8,7), new Date(2022,2,17)));