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) ); } }
关键修改说明
- 调整参数类型:将原函数的
YearMonth参数改为LocalDate,匹配需求中“接收当日日期作为输入”的要求。 - 补全判断逻辑:通过
findFirst()获取当月首个符合条件的工作日后,直接对比输入日期,返回布尔值;极端情况下当月无有效工作日时返回false。 - 优化节假日查询:缓存当年节假日集合,避免每次调用都查询数据库,提升性能。
示例验证(2024年6月)
- 6月1日(周六)→ false
- 6月2日(周日)→ false
- 6月3日(周一且非节假日)→ true
- 6月4日(周二且非节假日,但非月首个工作日)→ false
内容的提问来源于stack exchange,提问作者pri05
相关产品推荐
相关产品推荐

