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

Java实现:判断当前日期是否为排除周末节假日的月首个工作日

实现判断日期是否为当月首个工作日的Java函数

需求:实现一个Java函数,接收当日日期作为输入,返回布尔值,用于判断该日期是否为排除周末和节假日的当月首个工作日。节假日需从数据库获取当年的列表。

用户现有未完成代码:

boolean firstBusinessDayOfMonth(YearMonth month) {

 
    final Set<DayOfWeek> businessDays = EnumSet.of(
        MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
    );

    return
        month.atDay(1).datesUntil(month.plusMonths(1).atDay(1))
            .filter(date -> businessDays.contains(date.getDayOfWeek()))
            .filter(date -> !isHoliday(date))
            .findFirst();
         //return should compare with current date and give true or false
}

修改后的完整实现

import java.time.LocalDate;
import java.time.YearMonth;
import java.time.DayOfWeek;
import java.util.EnumSet;
import java.util.Set;
import java.util.Optional;

public class BusinessDayChecker {
    // 缓存当年节假日,避免重复查库
    private Set<LocalDate> annualHolidays;

    public boolean isFirstBusinessDayOfMonth(LocalDate inputDate) {
        final Set<DayOfWeek> businessDays = EnumSet.of(
            DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.WEDNESDAY,
            DayOfWeek.THURSDAY, DayOfWeek.FRIDAY
        );

        YearMonth currentMonth = YearMonth.from(inputDate);
        // 遍历当月所有日期,找到首个符合条件的工作日
        Optional<LocalDate> firstBusinessDay = currentMonth.atDay(1)
            .datesUntil(currentMonth.plusMonths(1).atDay(1))
            .filter(date -> businessDays.contains(date.getDayOfWeek()))
            .filter(date -> !isHoliday(date))
            .findFirst();

        // 比较首个工作日和输入日期是否一致
        return firstBusinessDay.map(inputDate::equals).orElse(false);
    }

    // 从数据库查询当年节假日的逻辑,需自行实现
    private boolean isHoliday(LocalDate date) {
        // 懒加载当年节假日,首次调用时从数据库查询
        if (annualHolidays == null) {
            annualHolidays = loadHolidaysFromDatabase(date.getYear());
        }
        return annualHolidays.contains(date);
    }

    // 模拟从数据库加载当年节假日的方法,实际需替换为数据库查询逻辑
    private Set<LocalDate> loadHolidaysFromDatabase(int year) {
        // 示例:返回当年法定节假日集合
        return Set.of(
            LocalDate.of(year, 1, 1),
            LocalDate.of(year, 5, 1),
            LocalDate.of(year, 10, 1)
        );
    }
}

关键修改说明

  1. 调整参数类型:将原函数的YearMonth参数改为LocalDate,匹配需求中“接收当日日期作为输入”的要求。
  2. 补全判断逻辑:通过findFirst()获取当月首个符合条件的工作日后,直接对比输入日期,返回布尔值;极端情况下当月无有效工作日时返回false。
  3. 优化节假日查询:缓存当年节假日集合,避免每次调用都查询数据库,提升性能。

示例验证(2024年6月)

  • 6月1日(周六)→ false
  • 6月2日(周日)→ false
  • 6月3日(周一且非节假日)→ true
  • 6月4日(周二且非节假日,但非月首个工作日)→ false

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:31:08