使用dayjs与dayjs-recur实现每月第N个工作日重复日期异常问题
问题分析与解决
你遇到的问题核心在于monthWeekByDay()返回的是具体的周序号(比如2022年9月30日是当月第5个周五),但不是所有月份都存在第5个周五(比如2022年10月最后一个周五是28日,属于第4周),所以你的 recurrence 规则只会匹配那些恰好有第N周对应星期几的月份,导致漏了10、11月的日期。
修正方案
要实现“每月最后一个指定工作日”的重复规则,不需要用monthWeekByDay()和weeksOfMonthByDay(),而是改用last()方法来指定每月最后一个目标星期几:
let dates = {}; const lastDayofMonth = dayjs().endOf("month"); // 获取目标星期几(比如Friday) const targetWeekday = lastDayofMonth.format('dddd'); const recurrence = lastDayofMonth .recur(dayjs().add(4, "month")) .every(targetWeekday) .daysOfWeek() .last() // 指定每月最后一个该星期几 .weeksOfMonth(); recurrence.all().forEach((date) => { dates[date.format("YYYY-MM-DD")] = { selected: true }; });
这个修改后的代码会生成你预期的结果:["2022-09-30","2022-10-28","2022-11-25","2022-12-30"],因为last()方法会直接定位到每个月最后一个目标星期几,不管它属于第几周。
补充说明
如果你的需求是“每月第N个工作日(不一定是最后一个)”,那原来的代码没问题;但如果是“每月最后一个工作日”,就必须用last()来替代具体的周序号判断,因为不同月份的周数分布不一致,固定周数会导致匹配失败。
内容的提问来源于stack exchange,提问作者Achraf
相关产品推荐
相关产品推荐

