如何在Java中实现支持节假日校验的当月首个工作日查询
实现当月首个工作日查询的方案
核心逻辑
- 第一步:取当月1号作为起始校验日期
- 第二步:从该日期开始逐日向后校验,直到找到第一个符合工作日要求的日期
- 第三步:工作日判定逻辑做解耦设计,默认包含周末排除规则,可自行扩展法定节假日、调休、自定义假期等判定规则
提示:你已具备获取指定日期前后一日的能力,无需额外实现日期偏移的底层逻辑,可直接替换示例中的偏移代码
可复用示例代码(Python)
提前实现is_workday(date)方法用于判定是否为工作日,返回True代表是工作日,返回False代表是非工作日,你可以根据业务需求自由调整该方法内的判定规则。
from datetime import datetime # 非工作日判定方法,可自定义修改规则 def is_workday(date): # 基础规则:排除周末(周一到周五对应weekday返回值0-4,周末为5、6) if date.weekday() >= 5: return False # 可在此处添加自定义非工作日判定规则,例如下方法定假期校验 # 2021年11月前3天为假期的示例配置 # custom_holidays = [datetime(2021,11,1).date(), datetime(2021,11,2).date(), datetime(2021,11,3).date()] # if date in custom_holidays: # return False return True # 核心方法:获取当月首个工作日 def get_first_workday_of_month(current_date=None): # 不传参默认取当前日期所在月份 if not current_date: current_date = datetime.now().date() # 取当月1号作为起始校验点 check_date = current_date.replace(day=1) while True: if is_workday(check_date): return check_date # 非工作日则取下一天,可直接替换为你已封装好的后一日获取方法 check_date = check_date.replace(day=check_date.day + 1) # 示例测试:2021年11月场景 test_date = datetime(2021,11,15).date() print(get_first_workday_of_month(test_date)) # 输出结果为 2021-11-04,和示例要求一致
补充说明
- 非工作日判定和核心查找逻辑完全分离,调整假期规则不需要改动查找逻辑
- 若需避免极端场景下的死循环,可自行添加最多校验31天的限制逻辑,自然月最多只有31天,不会出现无效校验
内容的提问来源于stack exchange,提问作者iwritecomeinmymind
相关产品推荐
相关产品推荐

