当前位置: 首页 > backend >正文

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, "周末", "节假日");}}
http://www.xdnf.cn/news/14181.html

相关文章:

  • 《单光子成像》第三章 预习2025.6.13
  • java集合篇(五) ---- List接口
  • 【技术追踪】用于 CBCT 到 CT 合成的纹理保持扩散模型(MIA-2025)
  • 3GPP协议PDF下载
  • Wireshark安装
  • shader实现发亮的粒子 + 透明度渲染可能出现的坑
  • Python学习(9) ----- Python的Flask
  • 课程笔记gitHub案例数据请求与展示
  • AIGC 基础篇 Python基础 06 函数基础
  • 嵌入式linux GDB使用教程
  • App渠道效果怎么统计和对比,有哪些实用方法和工具?
  • ROS的tf_tree中的节点含义详解
  • QGraphicsView
  • 【GESP真题解析】第 6 集 GESP 四级 2023 年 9 月编程题 1:进制转换
  • 【wvp-pro-gb28181】新建CallIdHeader失败的原因解析记录
  • 自动化KVM虚拟机创建脚本详解:从模板到高效部署的线上实践!
  • 【笔记】在新版本 Windows 系统安装回 Windows Subsystem for Android(WSA)
  • 「从实验室到工程现场:机器学习赋能智能水泥基复合材料研发全流程解析」
  • 表达式的自动类型转换
  • [Latex排版] 解决Something‘s wrong--perhaps a missing \item. 问题
  • 车辆车架号查询接口如何用Python实现调用?
  • 算法学习笔记:3.广度优先搜索 (BFS)——二叉树的层序遍历
  • 109.临时解决401错误
  • 线性三角波连续调频毫米波雷达目标识别
  • 【Vue2+antd 表格一直loading的问题】是赋值原因
  • Java 项目中实现统一的 追踪ID,traceId实现分布式系统追踪
  • 贵州建筑安全员C证理论考试题库
  • CHS和LBA的地址与的磁盘关联
  • C# 中委托和事件的深度剖析与应用场景
  • 求解偏微分方程组的通解