Java判断节假日(包含周末)工具类

在平时的业务需求中,难免会遇到需要获取一年中所有的工作日,或者跳过所有节假日(包括周末和法定节假日) 的情况。

判断是否周末很简单,但是法定节假日怎么办呢?

这里借助一个开源的网站(https://timor.tech/api/holiday/year/{year})写一个工具类。这里的{year}传一个年份进去即可查询本年度所有的法定节假日,如:https://timor.tech/api/holiday/year/2024就是查询2024年度所有法定节假日。

可以在浏览器上访问试一下
在这里插入图片描述

在代码中对这个网址进行http请求,话不多说,直接上代码:

    //节假日url
    public static String SYNC_ADDRESS = "https://timor.tech/api/holiday/year/";
    //假期
	static Map<String, List<String>> holiday = new HashMap<>();
	//调休日
    static Map<String, List<String>> extraWorkDay = new HashMap<>();

	    /**
     * @param date 日期参数 格式‘yyyy’,不传参则默认当前日期
     * @return 自己定义,我这里作为案例使用的是yes和no
     */
    public static String getYearHoliday(String date) throws ParseException {

        try {
        	//http请求
            String result = HttpUtils.sendGet(SYNC_ADDRESS + date);
            //字符串转json
            JSONObject json = JSONUtil.parseObj(result);
            //根据holiday字段获取jsonObject内容
            JSONObject holiday = json.getJSONObject("holiday");
            //如果获取不到key则不存在节假日,return
            if (holiday.size() == 0) {
                return "No!";
            }
            //定义list,后续作为value存放到全局变量中
            List hoList = new ArrayList<>();
            List extraList = new ArrayList<>();
            //遍历holiday的value
            for (Map.Entry<String, Object> entry : holiday.entrySet()) {
                String value = entry.getValue().toString();
                JSONObject jsonObject = JSONUtil.parseObj(value);
                String hoBool = jsonObject.getStr("holiday");
                String extra = jsonObject.getStr("date");
                //判断不是假期后调休的班
                if (hoBool.equals("true")) {
                    hoList.add(extra);
                    holiday.put(date, hoList);
                } else {
                    extraList.add(extra);
                    extraWorkDay.put(date, extraList);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
            return "No!";
        }
        return "Yes!";
    }

    //判断日期类型:0:工作日,1.周末,2.法定节假日
    /**
     * @param time 日期参数 格式‘yyyy-MM-dd’,不传参则默认当前日期
     * @return String 0:工作日,1.周末,2.法定节假日
     */
    public static String isWorkingDay(String time) throws ParseException {
        Date parse = null;
        //为空则返回当前时间
        if (StringUtils.isNotBlank(time)) {
            SimpleDateFormat getYearFormat = new SimpleDateFormat("yyyy-MM-dd");
            parse = getYearFormat.parse(time);
        } else {
            parse = new Date();
        }
        String newDate = new SimpleDateFormat("yyyy").format(parse);

        //判断key是否有参数年份
        //考虑年底需要获取跨年后的数据,所以要获取下一年的所有节假日情况
        if (!holiday.containsKey(newDate)) {
            String holiday = getYearHoliday(newDate);
            getYearHoliday(String.valueOf(Integer.parseInt(newDate) + 1));
            if ("No!".equals(holiday)) {
                return "该年份未分配日期安排!";
            }
        }

        //得到日期是星期几
        Date date = DateUtil.parseDate(time);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int weekday = DateUtil.dayOfWeek(calendar.getTime());


        //是否节假日
        if (holiday.get(newDate).contains(time)) {
            return "2";//法定节假日
        } else if (extraWorkDay.get(newDate).contains(time)) {
            return "0";//工作日
        } else if (weekday == Calendar.SATURDAY || weekday == Calendar.SUNDAY) {
            return "1";//周末
        } else {
            return "0";//工作日
        }
    }

最后调用这个工具类,只需判断是否为"0",不为"0"则是节假日(周末和法定节假日)

如果考虑到接口调用速度,可以采用定时任务进行入库,或者项目启动时调用等方式,避免接口超时问题。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是Java实现一个节假日工具类的示例代码: ```java import java.time.LocalDate; import java.util.HashMap; import java.util.Map; public class HolidayUtils { private static Map<LocalDate, String> holidayMap = new HashMap<>(); static { holidayMap.put(LocalDate.of(2022, 1, 1), "元旦"); holidayMap.put(LocalDate.of(2022, 2, 1), "春节"); holidayMap.put(LocalDate.of(2022, 4, 4), "清明节"); holidayMap.put(LocalDate.of(2022, 5, 1), "劳动节"); holidayMap.put(LocalDate.of(2022, 6, 1), "儿童节"); holidayMap.put(LocalDate.of(2022, 9, 10), "教师节"); holidayMap.put(LocalDate.of(2022, 10, 1), "国庆节"); holidayMap.put(LocalDate.of(2022, 12, 25), "圣诞节"); } /** * 判断指定日期是否是节假日 * * @param date 指定日期 * @return 如果是节假日,返回节假日名称,否则返回null */ public static String isHoliday(LocalDate date) { return holidayMap.get(date); } /** * 判断指定日期是否是工作日(即非周六周日和节假日) * * @param date 指定日期 * @return 如果是工作日,返回true,否则返回false */ public static boolean isWorkday(LocalDate date) { int weekDay = date.getDayOfWeek().getValue(); if (weekDay == 6 || weekDay == 7) { return false; } String holidayName = isHoliday(date); if (holidayName != null) { return false; } return true; } } ``` 在上面的代码中,我们定义了一个HolidayUtils类,其中包含了两个方法:isHoliday()和isWorkday()。 isHoliday()方法用于判断指定日期是否是节假日,如果是节假日,返回节假日名称,否则返回null。 isWorkday()方法用于判断指定日期是否是工作日,即非周六周日和节假日。如果是工作日,返回true,否则返回false。 在类的静态代码块中,我们初始化了一个节假日和对应节假日名称的Map,可以根据自己的需求进行修改。 使用该工具类时,只需要引入该类,然后调用isHoliday()和isWorkday()方法即可实现节假日和工作日的判断。例如: ```java LocalDate date = LocalDate.of(2022, 10, 2); if (HolidayUtils.isHoliday(date) != null) { System.out.println(date + "是节假日:" + HolidayUtils.isHoliday(date)); } else if (HolidayUtils.isWorkday(date)) { System.out.println(date + "是工作日。"); } else { System.out.println(date + "是周末。"); } ``` 输出结果为: ``` 2022-10-02是周末。 ``` 这样就完成了一个简单的节假日工具类的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值