如何基于截止日期倒推排除节假日的所需工作日对应最晚开始日期
从结束日期倒推工作日实现方案
Excel端直接实现
你要的WORKDAY反向逻辑Excel原生函数本身就支持,不需要额外写复杂逻辑,直接将代表工作日数的第二个参数设置为负数即可:
- 基础用法(默认排除周六日):
截止日期存在A2单元格,需求工作日数为20,公式为:=WORKDAY(A2, -20) - 带自定义法定节假日排除的用法:
提前将所有需要排除的公休、法定节假日录入到单独的单元格区域(比如C1:C10),公式为:=WORKDAY(A2, -20, C1:C10) - 自定义周末规则的进阶用法:
如果是非标准周末休息制度(比如单休、调休周末上班等),可以用WORKDAY.INTL函数,同样将工作日数参数设为负数:=WORKDAY.INTL(A2, -20, 1, C1:C10)
其中第三个参数为周末规则编码,1代表默认周六日休息,可根据需求选择对应编码即可。
通用编程实现逻辑
如果需要在非Excel环境实现该能力,可参考以下逻辑实现:
- 提前整理所有需要排除的法定节假日、公休日,存储为日期格式集合
- 初始化计算基准为给定的活动截止日期,剩余待扣减工作日数为需求的总工作日数
- 循环执行以下操作直到剩余工作日数为0:
- 基准日期向前推1天
- 校验当前日期是否为周六日,或属于预定义的排除假期集合
- 若属于排除范围则跳过,若不属于则剩余工作日数减1
- 循环结束后的基准日期即为活动最晚开始日期
Python实现示例
from datetime import datetime, timedelta def calculate_latest_start(end_date: datetime, required_workdays: int, exclude_holidays: set[datetime]) -> datetime: current_date = end_date remaining_days = required_workdays while remaining_days > 0: current_date -= timedelta(days=1) # 0-4代表周一到周五,5、6为周六日 if current_date.weekday() >= 5 or current_date in exclude_holidays: continue remaining_days -= 1 return current_date # 调用示例 if __name__ == "__main__": activity_end = datetime(2024, 11, 30) # 自定义需要排除的节假日示例 custom_holidays = { datetime(2024, 10, 1), datetime(2024, 10, 2), datetime(2024, 10, 3), datetime(2024, 10, 4), datetime(2024, 10, 5), datetime(2024, 10, 6), datetime(2024, 10, 7) } latest_start = calculate_latest_start(activity_end, 20, custom_holidays) print(latest_start.strftime("%Y-%m-%d"))
内容的提问来源于stack exchange,提问作者lika
相关产品推荐
相关产品推荐

