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

JavaScript计算合同在指定月份的有效天数

计算合同在指定月份的有效天数

需求梳理

你需要基于合同的起始/结束日期,计算合同在指定月份列表(以当月最后一天标识,如2022/9/30代表2022年9月)中的有效天数,比如合同2022/9/15到2022/10/24,在2022年9月的有效天数为16天。

现有代码的问题与优化方向

你提供的代码可以遍历合同覆盖的所有月份并计算天数,但未适配「只计算指定月份」的需求,同时日期处理逻辑可以更简洁。以下是优化后的代码,同时满足指定月份的过滤需求:

// 计算单个指定月份内的合同有效天数
function getDaysInSpecifiedMonth(contractStart, contractEnd, targetMonthLastDay) {
    // 转换日期对象
    const start = new Date(contractStart);
    const end = new Date(contractEnd);
    const targetDate = new Date(targetMonthLastDay);
    const targetYear = targetDate.getFullYear();
    const targetMonth = targetDate.getMonth();

    // 确定目标月份的起始和结束日期
    const monthStart = new Date(targetYear, targetMonth, 1);
    const monthEnd = new Date(targetYear, targetMonth + 1, 0); // 自动获取当月最后一天

    // 合同与目标月份无交集的情况,返回0
    if (end < monthStart || start > monthEnd) {
        return 0;
    }

    // 计算合同在目标月份的实际起止日
    const effectiveStart = start > monthStart ? start : monthStart;
    const effectiveEnd = end < monthEnd ? end : monthEnd;

    // 计算天数:时间差转换为天数后加1(包含起止当天)
    return Math.floor((effectiveEnd - effectiveStart) / (24 * 3600 * 1000)) + 1;
}

// 批量处理指定月份列表
function calculateAllSpecifiedMonths() {
    // 获取输入的合同起止日期
    const contractStartStr = document.getElementById("arr").value;
    const contractEndStr = document.getElementById("dep").value;
    // 示例指定月份列表,可根据实际场景从输入或配置中获取
    const specifiedMonths = ["2022/9/30", "2022/10/31", "2022/11/30"];

    const result = {};
    specifiedMonths.forEach(monthLastDay => {
        const yearMonth = `${new Date(monthLastDay).getFullYear()}年${new Date(monthLastDay).getMonth() + 1}月`;
        result[yearMonth] = getDaysInSpecifiedMonth(contractStartStr, contractEndStr, monthLastDay);
    });

    // 将结果输出到页面,格式可自定义
    document.getElementById("number-of-dates").value = JSON.stringify(result, null, 2);
}

代码说明

  • getDaysInSpecifiedMonth函数:负责计算单个指定月份的有效天数,核心逻辑:
    1. 先判断合同日期与目标月份是否有交集,无交集直接返回0
    2. 取合同起始日与月份起始日的较大值作为有效起始日
    3. 取合同结束日与月份结束日的较小值作为有效结束日
    4. 通过时间差计算天数,加1是因为要包含起止当天(比如9/15到9/30,共16天)
  • calculateAllSpecifiedMonths函数:批量处理所有指定月份,将结果以键值对形式输出,方便查看每个月份的有效天数

对原有代码的改进点

  1. 新增了指定月份过滤逻辑,只计算你需要的月份,而不是合同覆盖的所有月份
  2. 使用new Date(year, month + 1, 0)直接获取当月最后一天,替代原有复杂的判断逻辑
  3. 变量命名更语义化,可读性更强
  4. 结果返回结构化数据(对象),比原有的字符串拼接更便于后续处理

示例测试

用你提供的示例:合同起始2022/9/15,结束2022/10/24,指定月份["2022/9/30", "2022/10/31", "2022/11/30"],输出结果为:

{
  "2022年9月": 16,
  "2022年10月": 24,
  "2022年11月": 0
}

内容的提问来源于stack exchange,提问作者Brenda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:05:17