Java 小工具 - 节假日判断(包含周末),并提供离线版和在线版
自定义数据源
import lombok.Data;import java.util.List;/*** 节假日信息实体类** @author jason*/
@Data
public class HolidayInfo {/*** 完整年份, 整数*/private Integer year;/*** 所用国务院文件网址列表*/private List<String> papers;/*** 节假日具体日期列表*/private List<Day> days;@Datapublic static class Day {/*** 节日名称*/private String name;/*** 日期, ISO 8601 格式 (例如: "2023-10-01")*/private String date;/*** 是否为休息日*/private Boolean isOffDay;}}
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.jason.tools.base.ResourceUtil;
import com.jason.tools.oa.client.domain.HolidayInfo;
import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;
import java.util.List;/*** 节假日判断工具类 - 离线版/在线版* <p>* 数据来源:https://github.com/NateScarlet/holiday-cn*/
@Slf4j
public class HolidayListClient {private static final Integer holidayType = 1;// 默认离线版// private static final Integer holidayType = 2;private static final List<HolidayInfo.Day> holidayList = new ArrayList<>();static {// 默认获取当前年度holidayList.addAll(getHolidayList(DateUtil.year(DateUtil.date())));}/*** 获取节假日列表*/private static List<HolidayInfo.Day> getHolidayList(int year) {String holidayJsonStr = null;// 离线版if (holidayType == 1) {holidayJsonStr = ResourceUtil.readStringUtf8("static/json/holiday_" + year + ".json");}// 在线版if (holidayType == 2) {holidayJsonStr = HttpUtil.get("https://raw.githubusercontent.com/NateScarlet/holiday-cn/master/" + year + ".json");}HolidayInfo holidayInfo = JSONUtil.toBean(holidayJsonStr, HolidayInfo.class);return holidayInfo.getDays();}/*** 查看当前日期是否为节假日(包含周六或周日)*/public static boolean isHoliday(Date date) {return isHoliday(DateUtil.formatDate(date));}/*** 查看当前日期是否为节假日(包含周六或周日)*/public static boolean isHoliday(String date) {// 是否为周末(周六或周日)boolean isWeekend = DateUtil.isWeekend(DateUtil.parse(date));if (isWeekend) {// 查询周末是否上班HolidayInfo.Day day = holidayList.stream().filter(o -> !o.getIsOffDay()).filter(o -> StrUtil.equals(o.getDate(), date)).findFirst().orElse(null);if (ObjectUtil.isNotNull(day)) {// 周末调休上班o(╥﹏╥)oreturn false;}return true;}// 是否为节假日HolidayInfo.Day day = holidayList.stream().filter(HolidayInfo.Day::getIsOffDay).filter(o -> StrUtil.equals(o.getDate(), date)).findFirst().orElse(null);if (ObjectUtil.isNotNull(day)) {return true;}// 工作日正常上班o(╥﹏╥)oreturn false;}public static void main(String[] args) {// 是否节假日:true// 是否节假日:false// 是否节假日:true// 是否节假日:falseSystem.out.println("元旦, 是否节假日:" + isHoliday("2025-01-01"));// 元旦System.out.println("周五, 是否节假日:" + isHoliday("2025-04-25"));// 周五System.out.println("周六, 是否节假日:" + isHoliday("2025-04-26"));// 周六System.out.println("周日(调休),是否节假日:" + isHoliday("2025-04-27"));// 周日(调休)}}
附2025节假日信息表,数据来源:https://github.com/NateScarlet/holiday-cn
{"$schema": "https://raw.githubusercontent.com/NateScarlet/holiday-cn/master/schema.json","$id": "https://raw.githubusercontent.com/NateScarlet/holiday-cn/master/2025.json","year": 2025,"papers": ["https://www.gov.cn/zhengce/zhengceku/202411/content_6986383.htm"],"days": [{"name": "元旦","date": "2025-01-01","isOffDay": true},{"name": "春节","date": "2025-01-26","isOffDay": false},{"name": "春节","date": "2025-01-28","isOffDay": true},{"name": "春节","date": "2025-01-29","isOffDay": true},{"name": "春节","date": "2025-01-30","isOffDay": true},{"name": "春节","date": "2025-01-31","isOffDay": true},{"name": "春节","date": "2025-02-01","isOffDay": true},{"name": "春节","date": "2025-02-02","isOffDay": true},{"name": "春节","date": "2025-02-03","isOffDay": true},{"name": "春节","date": "2025-02-04","isOffDay": true},{"name": "春节","date": "2025-02-08","isOffDay": false},{"name": "清明节","date": "2025-04-04","isOffDay": true},{"name": "清明节","date": "2025-04-05","isOffDay": true},{"name": "清明节","date": "2025-04-06","isOffDay": true},{"name": "劳动节","date": "2025-04-27","isOffDay": false},{"name": "劳动节","date": "2025-05-01","isOffDay": true},{"name": "劳动节","date": "2025-05-02","isOffDay": true},{"name": "劳动节","date": "2025-05-03","isOffDay": true},{"name": "劳动节","date": "2025-05-04","isOffDay": true},{"name": "劳动节","date": "2025-05-05","isOffDay": true},{"name": "端午节","date": "2025-05-31","isOffDay": true},{"name": "端午节","date": "2025-06-01","isOffDay": true},{"name": "端午节","date": "2025-06-02","isOffDay": true},{"name": "国庆节、中秋节","date": "2025-09-28","isOffDay": false},{"name": "国庆节、中秋节","date": "2025-10-01","isOffDay": true},{"name": "国庆节、中秋节","date": "2025-10-02","isOffDay": true},{"name": "国庆节、中秋节","date": "2025-10-03","isOffDay": true},{"name": "国庆节、中秋节","date": "2025-10-04","isOffDay": true},{"name": "国庆节、中秋节","date": "2025-10-05","isOffDay": true},{"name": "国庆节、中秋节","date": "2025-10-06","isOffDay": true},{"name": "国庆节、中秋节","date": "2025-10-07","isOffDay": true},{"name": "国庆节、中秋节","date": "2025-10-08","isOffDay": true},{"name": "国庆节、中秋节","date": "2025-10-11","isOffDay": false}]
}
聚合数据API
测试页面:https://www.juhe.cn/apiexplorer/606
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;import java.util.Map;@Slf4j
public class HolidayApiClient {public static void main(String[] args) {System.out.println("是否节假日:" + isHoliday("2023-06-23"));}/*** 查看当前日期是否为节假日* 单日限制50次免费调用*/public static boolean isHoliday(String date) {String url = "http://apis.juhe.cn/fapig/calendar/day";Map<String, Object> paramMap = MapUtil.ofEntries(MapUtil.entry("key", "99b24bxxx51bf3"), // 替换实际使用 keyMapUtil.entry("detail", "1"),MapUtil.entry("date", date));String result = HttpUtil.post(url, paramMap);// 周末,工作日,节假日String statusDesc = JSONUtil.parseObj(result).getJSONObject("result").getStr("statusDesc");log.info("isHoliday-url:{}", url);log.info("isHoliday-request:{}", JSONUtil.toJsonStr(paramMap));log.info("isHoliday-response:{}", result);log.info("isHoliday-{}是否为节假日:{}", date, StrUtil.equalsAny(statusDesc, "周末", "节假日"));return StrUtil.equalsAny(statusDesc, "周末", "节假日");}}