Luxon如何获取两个日期间每月指定日号的数量及日期列表
基于Luxon计算区间内每月固定日触发日期
直接上可运行的实现,先对齐核心规则:
- 输入为起止日期字符串(格式
YYYY-MM-DD)、每月固定触发日号 - 有效触发日必须满足:≥开始日期,≤结束日期
- 如果指定日号超过当月最大天数(比如2月传31、小月传31),自动取当月最后一天作为触发日
- 返回结果包含有效日期列表、触发总次数两个字段
需求中给出的边界案例验证:区间
2022-01-10至2022-08-20、触发日设为25时,最终返回有效次数为7,和预期一致。
参考用例对齐
输入
每月日号: 5 开始日期: 2022-07-08 结束日期: 2022-09-05
输出
2022-08-05 2022-09-05
实现代码
首先安装依赖:
npm install luxon
核心逻辑代码:
const { DateTime } = require('luxon'); function getMonthlyTriggerDates(dayOfMonth, startStr, endStr) { // 统一转成Luxon时间对象,抹平时分秒精度影响 const start = DateTime.fromFormat(startStr, 'yyyy-MM-dd').startOf('day'); const end = DateTime.fromFormat(endStr, 'yyyy-MM-dd').endOf('day'); const validDates = []; // 从开始日期所在月开始逐月遍历,直到超出结束日期所在月 let currentMonthPointer = start.startOf('month'); while (currentMonthPointer <= end) { // 处理当月天数不足指定日号的情况,自动取当月最后一天 const actualTriggerDay = Math.min(dayOfMonth, currentMonthPointer.daysInMonth); const triggerDate = currentMonthPointer.set({ day: actualTriggerDay }); // 校验当前触发日是否在有效区间内 if (triggerDate >= start && triggerDate <= end) { validDates.push(triggerDate.toFormat('yyyy-MM-dd')); } // 指针移到下一个月 currentMonthPointer = currentMonthPointer.plus({ months: 1 }); } return { dateList: validDates, totalCount: validDates.length }; } // 测试参考用例 console.log(getMonthlyTriggerDates(5, '2022-07-08', '2022-09-05').dateList); // 输出: [ '2022-08-05', '2022-09-05' ] // 测试边界案例 console.log(getMonthlyTriggerDates(25, '2022-01-10', '2022-08-20').totalCount); // 输出: 7
实现说明
- 遍历逻辑只覆盖起止日期之间的月份,没有多余循环,性能最优
- 自动处理闰年2月、大小月天数不足的异常场景,不会生成无效日期
- 时间比较统一取日初、日终时间点,避免时分秒精度差导致的边界判断错误
- 直接返回结构化结果,需要列表或者总次数都可以直接取值
内容的提问来源于stack exchange,提问作者VG-Electronics
相关产品推荐
相关产品推荐

