You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:15:41