LocalDate.query() 不直接判断节假日,需配合自定义 TemporalQuery 实现;示例 HolidayQuery 用 MonthDay 匹配固定节日,复杂场景需结合农历解析与调休表。

Java 的 LocalDate.query() 本身不直接支持“判断是否为节假日”,它只是一个通用的查询入口,需要配合自定义的 TemporalQuery 实现。真正起作用的是你传入的查询逻辑——你需要自己定义节假日规则(如基于固定日期、调休表或第三方 API),再通过 query() 调用它。
1. 理解 LocalDate.query() 的作用
LocalDate.query(TemporalQuery 是一个委托方法,它把当前日期交给 query 对象去处理,并返回任意类型结果(比如 Boolean)。它本身不做业务判断,只是提供统一调用接口。
要实现“是否法定节假日”判断,你需要:
- 定义一个实现
TemporalQuery的类或 lambda - 在
queryFrom(TemporalAccessor)方法中编写节假日判断逻辑 - 确保传入的
TemporalAccessor可安全转为LocalDate(LocalDate本身满足)
2. 编写一个简单的法定节假日查询器(示例:仅含固定节日)
以下是一个轻量级实现,覆盖元旦、春节、劳动节、国庆节等常见固定日期(不含调休逻辑):
public class HolidayQuery implements TemporalQuery<boolean> {
private static final Set<monthday> FIXED_HOLIDAYS = Set.of(
MonthDay.of(1, 1), // 元旦
MonthDay.of(10, 1), // 国庆第一天
MonthDay.of(10, 2), // 国庆第二天
MonthDay.of(10, 3), // 国庆第三天
MonthDay.of(5, 1) // 劳动节
);
@Override
public Boolean queryFrom(TemporalAccessor temporal) {
if (temporal == null) return false;
LocalDate date = LocalDate.from(temporal);
MonthDay monthDay = MonthDay.from(date);
return FIXED_HOLIDAYS.contains(monthDay);
}
public static final HolidayQuery INSTANCE = new HolidayQuery();
}</monthday></boolean>
使用方式:
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
LocalDate today = LocalDate.now(); boolean isHoliday = today.query(HolidayQuery.INSTANCE); // true 或 false
3. 处理更复杂的节假日(含调休与农历节日)
纯固定日期无法覆盖春节(农历)、中秋等变动日期,也不支持国务院发布的调休安排。实际项目中建议:
- 使用成熟库如 chinese-lunar-calendar 解析农历节日
- 维护一份年度调休 JSON 表(如从政府官网抓取),加载到内存或数据库
- 封装成 Spring Bean,配合缓存(如
@Cacheable)提升性能 - 避免在
queryFrom()中做远程 HTTP 调用(阻塞且违反函数式语义)
例如,增强版查询器可这样设计:
public class SmartHolidayQuery implements TemporalQuery<boolean> {
private final Set<localdate> officialHolidays; // 预加载的全年节假日(含调休补班标记)
private final LunarDateConverter lunarConverter;
public SmartHolidayQuery(Set<localdate> holidays, LunarDateConverter converter) {
this.officialHolidays = holidays;
this.lunarConverter = converter;
}
@Override
public Boolean queryFrom(TemporalAccessor temporal) {
LocalDate date = LocalDate.from(temporal);
if (officialHolidays.contains(date)) {
return true;
}
// 补充:判断是否为春节/中秋等农历节日(需 lunarConverter 支持)
return lunarConverter.isSpringFestival(date) || lunarConverter.isMidAutumn(date);
}
}</localdate></localdate></boolean>
4. 注意事项与常见误区
不要误以为 query() 自带节假日能力 —— 它只是个“管道”,逻辑全靠你写。
-
TemporalQuery应是无状态、线程安全的,推荐单例或不可变实例 - 避免在
queryFrom中抛出未检查异常;返回null可能引发 NPE,建议统一返回Boolean.FALSE - 如果需区分「节假日」和「调休工作日」,应返回枚举(如
HolidayStatus.HOLIDAY / WORKDAY / WEEKEND),而非仅布尔值 - JDK 自带的
WeekFields、ChronoField等不包含节假日信息,勿混淆
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










