繁体   English   中英

如何使用时刻迭代周数,周的开始/结束日期

[英]How to iterate week number, start/end date of weeks using moment

我怎样才能得到所有week numberfrom/to date

下面的代码是我构建的用于显示特定月份的week numberfrom/to date的代码,每当我在循环中插入 function 时它都会返回无限循环。

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())
    );
})

结果应返回week number列表, from/to date
样本 Url: https://savvytime.com/week-number/philippines/2022

这是我运行 function 外循环时的示例:

 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>

当您计算 12 月(第 12 个月)的周数时,您从前一个月(11 月,即 11 日)的最后一周开始,并且在您的do {...} while循环中,您将 7 天添加到weekStart 到目前为止一切顺利,但是您的while (weekStart.getMonth() < month)正在检查weekStart.getMonth()的 0-11 值,当它从 11 向前滚动时,它不会转到 12,而是转到 0。所以它总是小于 12(12 月!)!

您可以通过将while调整为以下方式来解决此问题:

while (weekStart.getMonth() < month && (weekStart.getMonth() || (month < 12) ))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM