Quiero obtener una lista de todos los meses que existen entre las 2 fechas en JS. Por ejemplo:
'2021-04-25' a '2021-05-12' debe devolver [4,5] // case when num difference between dates is less than 30 days
'2021-04-25' a '2021-08-12' debería regresar [4,5,6,7,8]
'2021-10-25' a '2022-02-12' debería devolver [10,11,12,1,2]
El siguiente código funciona pero no da el resultado correcto para '2021-04-25' a '2021-05-12'. regresa solo [4]
Probé ejemplos aquí JavaScript: ¿obtener todos los meses entre dos fechas? pero momentjs no da endMonth si días <30
En el sitio de momentjs dicen: "Ahora, en general, consideramos que Moment es un proyecto heredado en modo de mantenimiento. No está muerto, pero de hecho está hecho". Puede utilizar otra biblioteca como fecha de finalización.
Aquí hay un ejemplo con la misma lógica propuesta por AlTheLazyMonkey con date-fns
import { addMonths, getMonth, isBefore, isEqual, startOfMonth } from "date-fns"; let start = "2021-06-15"; let end = "2021-12-26"; const isSameOrBefore = (start, end) => { const result = (isBefore(start, end) || isEqual(start, end)) ? true : false return result }; const getArrayOfMonths = (start, end) => { let startDate = startOfMonth(new Date(start)); let endDate = startOfMonth(new Date(end)); const arrayOfMonths = []; if (isBefore(endDate, startDate)) { console.log("End date must be greated than start date."); } while (isSameOrBefore(startDate, endDate)) { arrayOfMonths.push(getMonth(startDate) + 1); startDate = addMonths(startDate, 1); } return arrayOfMonths; }; console.log(getArrayOfMonths(start, end)); console.log(getArrayOfMonths("2021-02-15", "2021-9-15"));Creo que esta es una buena solución para obtener los resultados que está buscando.
function getMonths(start, end) { start = moment(start).startOf('month'); end = moment(end).startOf('month'); if (start.isAfter(end))[start, end] = [end, start]; // This is only for order the dates const months = []; while (start.isSameOrBefore(end)) { months.push(start.month() + 1); start.add(1, 'months'); } return months; } console.log(getMonths('2021-04-25', '2021-05-12')); console.log(getMonths('2021-04-25', '2021-08-12')); console.log(getMonths('2021-10-25', '2022-02-12')); console.log(getMonths('2021-04-25', '2022-02-12')); console.log(getMonths('2021-06-26', '2020-02-12')); <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>