技术求助:如何使用Moment.js获取最近的下一个第1或第3个周一
解决Moment.js获取下一个最近的第1个或第3个周一的问题
没问题,我来帮你实现这个需求!核心思路是先找出所有符合条件的未来候选日期(当月第1个周一、当月第3个周一、次月第1个周一),然后从中挑选离当前日期最近的那一个。
实现步骤说明
- 确定基准日期:以传入的日期(比如当前日期)为基准,用Moment.js克隆对象避免修改原日期。
- 计算当月第1个周一:从当月第一天开始,找到第一个周一。如果这个周一还在当前日期之后,就把它加入候选列表。
- 计算当月第3个周一:在当月第1个周一的基础上加14天(两周),如果这个日期在当前之后,也加入候选。
- 计算次月第1个周一:同样从次月第一天开始找第一个周一,加入候选列表。
- 筛选最近的日期:遍历候选列表,找出与当前日期时间差最小的那个日期。
完整代码实现
function getClosestFirstOrThirdMonday(targetDate) { // 克隆传入的日期,避免修改原数据 const current = moment(targetDate); // 计算当月第一个周一 const firstMonOfMonth = current.clone().startOf('month').day(1); // 计算当月第三个周一(第一个周一加14天) const thirdMonOfMonth = firstMonOfMonth.clone().add(14, 'days'); // 计算次月第一个周一 const firstMonOfNextMonth = current.clone().add(1, 'month').startOf('month').day(1); // 收集所有符合条件的未来候选日期 const candidates = []; if (firstMonOfMonth.isAfter(current)) { candidates.push(firstMonOfMonth); } if (thirdMonOfMonth.isAfter(current)) { candidates.push(thirdMonOfMonth); } candidates.push(firstMonOfNextMonth); // 找出距离当前日期最近的候选 let closestDate = candidates[0]; candidates.forEach(date => { if (date.diff(current) < closestDate.diff(current)) { closestDate = date; } }); // 返回格式化后的日期(可根据需求调整格式) return closestDate.format('MM/DD'); } // 测试你的例子 console.log(getClosestFirstOrThirdMonday('202X-01-18')); // 输出 01/20 console.log(getClosestFirstOrThirdMonday('202X-01-27')); // 输出 02/03
代码细节解释
- 使用
clone()方法:Moment.js的对象是 mutable 的,克隆可以防止修改原日期对象导致的意外问题。 startOf('month'):将日期设置为当月的第一天,方便后续找第一个周一。day(1):Moment.js中day(0)是周日,day(1)是周一,这个方法会自动调整到最近的周一(如果当月第一天不是周一,就会跳到当月第一个周一)。diff()方法:计算两个日期之间的毫秒差,用来比较哪个候选日期更近。
你可以根据自己的需求调整返回的日期格式,比如用format('YYYY-MM-DD')来获取完整的年月日。
内容的提问来源于stack exchange,提问作者scotth527
相关产品推荐
相关产品推荐

