JavaScript计算排除周末与自定义节假日的工作日天数问题
解决节假日落在周末时重复扣减天数的问题
我来帮你搞定这个计算工作日天数的bug!你的核心问题很明确:当节假日落在休息日(周四、周五)时,代码错误地同时扣除了周末休息日和节假日的天数,导致最终计算结果比实际少。
问题根源
你的现有逻辑应该是先计算总天数,然后减去周末天数,再减去所有节假日天数——但这里忽略了一个关键:只有落在工作日(周六至周三)的节假日才需要扣除,休息日的节假日本来就不算工作日,根本不需要额外扣减。
比如你举的2018/09/18-2018/09/22的例子,假设其中某个节假日落在周四/周五,现有代码会先把这两天算作周末扣除一次,又因为是节假日再扣除一次,相当于多扣了1天,最终结果就少了。
修正后的核心思路
- 先筛选出请假区间内的所有工作日(周六至周三),休息日直接跳过不计入基数
- 从工作日列表中,再剔除掉落在工作日内的节假日,剩余的就是有效天数
代码示例(以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
相关产品推荐
相关产品推荐

