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"则是节假日(周末和法定节假日)

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值