除过法定节假日,计算截至日期的算法

除过法定节假日,计算截至日期的算法

1.获取当年节假日信息
请求链接:https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php? query=2020&resource_id=6018
组装所有节假日及调休

private static JSONArray getHoliday() {
        String s = HttpUtil.get("https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?       query=2020&resource_id=6018");
        JSONObject jsonObject = JSONObject.parseObject(s);
        JSONArray data = (JSONArray) jsonObject.get("data");
        JSONObject item = (JSONObject) data.get(0);
        JSONArray holidays = item.getJSONArray("holiday");
        JSONArray jsonArray = new JSONArray();
        holidays.stream().forEach(it -> {
            JSONObject holiday = (JSONObject) it;
            JSONArray list = holiday.getJSONArray("list");
            for (Object o : list) {
                JSONObject i = (JSONObject) o;
                if (null == i.getJSONArray("list")) {
                    jsonArray.add(i);
                } else {
                    jsonArray.addAll(i.getJSONArray("list"));
                }

            }
        });
        //组装格式为为 "list":[  {  "date":"2020-1-1","status":"1" }  ] status  1: 代表假期   2:调休工作日
        return jsonArray;
    }

给定日期数组,以及获取的假期数据,计算去除法定节假日以及周末后的截至日期

对所有日期数组进行遍历,逐个进行判断处理

    private static DateTime getLimitTime(List<DateTime> dateTimes, JSONArray jsonArray) {
        List<String> date = jsonArray.stream().map(it -> ((JSONObject) it).getString("date")).collect(Collectors.toList());
        Map<String, String> map = jsonArray.stream().collect(Collectors.toMap(it -> ((JSONObject) it).getString("date"), it -> ((JSONObject) it).getString("status"), (pre, next) -> pre));
        DateTime offsetDate = null;
        for (int i = 0; i < dateTimes.size(); i++) {
            String formatDate = DateUtil.format(dateTimes.get(i), "yyyy-M-d");
            if (i == 0) {
                continue;
            }
            if (date.contains(formatDate)) {
                String status = map.get(formatDate);
                if ("1".equals(status)) {
                    offsetDate = DateUtil.offsetDay(dateTimes.get(i), dateTimes.size() - i);
                    dateTimes.add(offsetDate);
                }
            } else {
                int week = DateUtil.dayOfWeek(dateTimes.get(i));
                if ((week == 1 || week == 7)) {
                    offsetDate = DateUtil.offsetDay(dateTimes.get(i), dateTimes.size() - i);
                    dateTimes.add(offsetDate);
                }else {
                    offsetDate = dateTimes.get(i);
                }
            }

        }
        return offsetDate;
    }

主方法 ,执行

先获取当前日期和截至天数有日期数组,然后就获取到当前日期距离天数后除过法定节假日后得到的截至日期

    public static void main(String[] args) {
        JSONArray jsonArray = getHoliday();
        DateTime date = DateUtil.parseDate("2020-09-25");
        DateTime dateTime = DateUtil.offsetDay(date, 5);
        List<DateTime> dateTimes = DateUtil.rangeToList(date, dateTime, DateField.DAY_OF_YEAR);
        DateTime limitTime = getLimitTime(dateTimes, jsonArray);
        System.out.println(limitTime);
    }

如果你有好的思路算法,请在下方评论处进行讨论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值