Java 获取每年调休后的节假日

        突然来了个需求,要在考勤系统上根据每年的节假日自动设置休息日。

于是在网上各种找计算节假日是怎么调休的,找了各种资源,第三方网站,都感觉不怎么满意。

知道看到了一篇将百度的日历页面的数据拉下来的方法:

于是,跟着上面提供的方法,开始搞接口:

 

package com.weroom.core.util.holidayUtil;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSONObject;
import com.weroom.core.domain.result.HolidayResult;
import com.weroom.core.utils.JsonUtils;
import com.weroom.core.utils.StringUtils;
import lombok.extern.log4j.Log4j2;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

@Log4j2
public class BaiduHolidayUtil {
    public static String sendGet(String url, String param) {
        String result = "";
        BufferedReader in = null;
        try {
            String urlNameString = url + "/" + param;
            URL realUrl = new URL(urlNameString);
            URLConnection connection = realUrl.openConnection();
            connection.setRequestProperty("Accept-Charset", "UTF-8");
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            connection.connect();

            String contentType = connection.getContentType();
            String charset = "";
            if (contentType != null) {
                charset = contentType.replaceAll(".*charset=([^\"]+).*", "$1");
            }

            in = new BufferedReader(new InputStreamReader(connection.getInputStream(),charset));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }

    public static void main(String[] args) {
        //开始的年份
        int startYear = 2024;
        List<HolidayResult> allList =  loop(startYear+"");

        System.out.println(JsonUtils.object2JsonNoEscaping(allList));
        System.out.println(allList.size());
    }


    public static List<HolidayResult> loop(String year) {

        List<HolidayResult> resultList  = new ArrayList<>();

        for(int j = 1; j <= 12; j++) {
            String s = BaiduHolidayUtil.sendGet("https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query="+year+"%E5%B9%B4"+j+"%E6%9C%88&co=&resource_id=39043&t=1617089428269&ie=utf8&oe=gbk&cb=op_aladdin_callback&format=json&tn=wisetpl&cb=jQuery110203576901702188473_1617089118772&_=1617089118776", "");
            if (StringUtils.isBlank(s)) {
                continue;
            }
            s = s.substring(s.indexOf("("));
            s = s.substring(1, s.length() - 2);
            Map<String, Object> map = (Map<String, Object>) JSONObject.parse(s);

            List list = (List) map.get("data");
            if (CollectionUtil.isEmpty(list)) {
                continue;
            }
            Map data = (Map) list.get(0);
            if (null == data) {
                continue;
            }
            List<Map> almanac = (List<Map>) data.get("almanac");
            if(almanac == null || almanac.size() == 0) {
                continue;
            }

            //只以下几个节日输出名称,其他的(如世界读书日等) 不输出
            List<String> holidayNameList = new ArrayList<>();
            holidayNameList.add("春节");
            holidayNameList.add("元旦");
            holidayNameList.add("除夕");
            holidayNameList.add("清明");
            holidayNameList.add("劳动节");
            holidayNameList.add("端午节");
            holidayNameList.add("中秋节");
            holidayNameList.add("国庆节");

            for(int i = 1; i < almanac.size(); i++) {
                String key = ((String)almanac.get(i).get("oDate")).substring(0, 10);
                String status = (String)almanac.get(i - 1).get("status");
                Object obj = almanac.get(i-1).get("festivalList");

                if("1".equals(status) || "2".equals(status)) {
                    HolidayResult result = new HolidayResult();
                    result.setDay(key);
                    result.setState(status);
                    if (null != obj && holidayNameList.contains(obj.toString())) {
                        result.setName(obj.toString());
                    }
                    resultList.add(result);
                }
            }
        }
        //去重并排序
        if (CollectionUtil.isNotEmpty(resultList)) {
            Map<String,HolidayResult> map = resultList.stream()
                    .filter(Objects::nonNull)
                    .filter(a -> a.getDay() != null && a.getDay().contains(year))
                    .collect(Collectors.toMap(a -> a.getDay(), Function.identity(),(v1,v2) -> v1));
            resultList = new ArrayList<>(map.values());
            resultList.sort(Comparator.comparing(HolidayResult :: getDay));
        }
        return resultList;
    }
}

输出的结果:

其中state=1表示休息,state=2表示上班

参考链接:java节假日 调休的代码 java计算法定节假日_mob6454cc6e8f43的技术博客_51CTO博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: networkdays函数是一种在Excel中用于计算两个日期之间工作日数量的函数。它可以用于计算两个日期之间的实际工作日数量,排除掉周末和指定的节假日。如果在节假日期间调休上班,也可以在计算工作日数量时进行调整。 在使用networkdays函数时,需要指定两个日期和一个节假日列表。节假日列表可以是一个单独的单元格范围,也可以是由多个单元格范围组成的数组。如果没有指定节假日列表,则默认排除周六和周日。 当遇到节假日调休情况时,可以将调休的日期添加到节假日列表中。这样,在计算工作日数量时,调休的日期就会被排除在外,不会计算在内。这样可以保证计算的结果是准确的。 使用networkdays函数可以方便地计算节假日调休后的工作日数量,从而可以更好地安排工作和时间。它可以应用于各种场景,比如项目管理、假期计划等,帮助我们更好地利用时间,提高效率。 ### 回答2: Networkdays是一个Excel函数,用于计算两个日期之间的工作日天数。而节假日调休则是指将法定节假日调整到周末,并在周末加班,以保障每年休假天数不变的做法。对于这个问题,我们可以这样回答: 网络工作日函数(networkdays)是一种用于计算两个日期之间的工作日天数的Excel函数。而节假日调休是一种管理者为了调整法定节假日与员工工作时间的关系而采取的措施。通常情况下,法定节假日是固定的,但为了保障员工的休假权益,当某一法定节假日恰好与周末相连时,会将这个法定节假日调整到周末,从而延长员工的休假时间。此外,在调整后的周末,员工可能需要加班以弥补因调休而延长的休假时间。这样,可以保证每年员工享有的休假天数不变。networkdays函数在计算两个日期之间的工作日天数时,可以排除掉调休后的周末,从而得到准确的工作日数。因此,networkdays函数在处理节假日调休后的工作日计算中非常有用。总之,networkdays函数和节假日调休都是为了确保员工的工作时间和休假时间能够得到合理安排的工具和措施。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值