¿Cómo puedo obtener week number , from/to date de un mes específico?
El siguiente código es lo que construyo para mostrar week number , from/to date de un mes específico y devuelve un bucle infinito cada vez que inserto la función dentro del bucle.
function getISOWeeksInMonth(month, year) { let weekStart = new Date(year, month - 1, 1); weekStart.setDate(weekStart.getDate() - (weekStart.getDay() || 7) + 1); let weekEnd = new Date(weekStart); weekEnd.setDate(weekEnd.getDate() + 6); let weekNum = moment(weekStart, "YYYY-MM-DD").week() let weeks = []; do { weeks.push({ weekNum : weekNum++, start: new Date(weekStart), end: new Date(weekEnd) }); weekStart.setDate(weekStart.getDate() + 7); weekEnd.setDate(weekEnd.getDate() + 7); } while (weekStart.getMonth() < month); return weeks; } _.forEach(moment.months(), function (month_name) { var month_number = moment().month(month_name).format("MM"); getISOWeeksInMonth(month_number, 2022).forEach(week => console.log( 'Week : ' + week.weekNum + '\nStart: ' + week.start.toDateString() + '\nEnd : ' + week.end.toDateString()) ); }) El resultado debe devolver la lista el week number , from/to date
Ejemplo de URL: https://savvytime.com/week-number/philippines/2022
Aquí está la muestra cuando ejecuto la función fuera del bucle:
function getISOWeeksInMonth(month, year) { let weekStart = new Date(year, month - 1, 1); weekStart.setDate(weekStart.getDate() - (weekStart.getDay() || 7) + 1); let weekEnd = new Date(weekStart); weekEnd.setDate(weekEnd.getDate() + 6); let weekNum = moment(weekStart, "YYYY-MM-DD").week() let weeks = []; do { weeks.push({ weekNum : weekNum++, start: new Date(weekStart), end: new Date(weekEnd) }); weekStart.setDate(weekStart.getDate() + 7); weekEnd.setDate(weekEnd.getDate() + 7); } while (weekStart.getMonth() < month); return weeks; } getISOWeeksInMonth(1, 2022).forEach(week => console.log( 'Week : ' + week.weekNum + '\nStart: ' + week.start.toDateString() + '\nEnd : ' + week.end.toDateString()) ); <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.2/moment.min.js"></script> function getISOWeeksInMonth(month, year) { let weekStart = new Date(year, month - 1, 1); weekStart.setDate(weekStart.getDate() - (weekStart.getDay() || 7) + 1); let weekEnd = new Date(weekStart); weekEnd.setDate(weekEnd.getDate() + 6); let weeks = []; do { let weekNum = moment(weekStart, "YYYY-MM-DD").week() weeks.push({ weekNum : weekNum, start: new Date(weekStart), end: new Date(weekEnd) }); weekStart.setDate(weekStart.getDate() + 7); weekEnd.setDate(weekEnd.getDate() + 7); } while (weekStart.getMonth() < month && (weekStart.getMonth() || (month < 12) )); return weeks; } let _ = moment.months() _.forEach(function (month_name) { var month_number = moment().month(month_name).format("MM"); getISOWeeksInMonth(month_number, 2022).forEach(week => console.log( 'Week : ' + week.weekNum + '\nStart: ' + week.start.toDateString() + '\nEnd : ' + week.end.toDateString()) ); }) <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.2/moment.min.js"></script> Cuando calcula las semanas en diciembre (mes 12), comienza con la última semana del mes anterior (noviembre, es decir, 11), y en su ciclo do {...} while while, agrega 7 días a weekStart . Hasta aquí todo bien, pero tu while (weekStart.getMonth() < month) está verificando el valor 0-11 de weekStart.getMonth() , y cuando avanza desde 11, en lugar de ir a 12, va a 0. Entonces siempre es menos de 12 (¡diciembre!)!
Puedes arreglar esto ajustando tu while a:
while (weekStart.getMonth() < month && (weekStart.getMonth() || (month < 12) ))