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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:09:20