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

JavaScript计算排除周末与自定义节假日的工作日天数问题

解决节假日落在周末时重复扣减天数的问题

我来帮你搞定这个计算工作日天数的bug!你的核心问题很明确:当节假日落在休息日(周四、周五)时,代码错误地同时扣除了周末休息日和节假日的天数,导致最终计算结果比实际少。

问题根源

你的现有逻辑应该是先计算总天数,然后减去周末天数,再减去所有节假日天数——但这里忽略了一个关键:只有落在工作日(周六至周三)的节假日才需要扣除,休息日的节假日本来就不算工作日,根本不需要额外扣减。

比如你举的2018/09/18-2018/09/22的例子,假设其中某个节假日落在周四/周五,现有代码会先把这两天算作周末扣除一次,又因为是节假日再扣除一次,相当于多扣了1天,最终结果就少了。

修正后的核心思路

  1. 先筛选出请假区间内的所有工作日(周六至周三),休息日直接跳过不计入基数
  2. 从工作日列表中,再剔除掉落在工作日内的节假日,剩余的就是有效天数

代码示例(以Python为例)

from datetime import datetime, timedelta

def calculate_valid_workdays(start_str, end_str, holiday_list):
    # 转换日期格式为datetime对象
    start_date = datetime.strptime(start_str, "%Y/%m/%d")
    end_date = datetime.strptime(end_str, "%Y/%m/%d")
    
    valid_days = 0
    current_date = start_date
    
    # 遍历区间内每一天
    while current_date <= end_date:
        # 判断是否为工作日:周六(6)、周日(7)、周一(1)、周二(2)、周三(3)(基于isoweekday,周一=1,周日=7)
        is_weekday = current_date.isoweekday() in (1,2,3,6,7)
        
        if is_weekday:
            # 仅当工作日是节假日时,才不计入有效天数
            date_str = current_date.strftime("%Y/%m/%d")
            if date_str not in holiday_list:
                valid_days += 1
        
        current_date += timedelta(days=1)
    
    return valid_days

# 测试你的示例:假设节假日为["2018/09/20"](周四,休息日)
holidays = ["2018/09/20"]
print(calculate_valid_workdays("2018/09/18", "2018/09/22", holidays))
# 若22号为节假日,输出即为2,符合你的预期

代码说明

  • 先通过isoweekday()判断日期是否属于你的工作日范围,休息日直接跳过
  • 只有工作日才会检查是否在节假日列表中,避免了休息日的节假日被重复扣减
  • 逻辑清晰,每一步都只处理需要计入基数的日期,从根源上解决重复扣减的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:41:20