获取周末及节假日

package com.testwar.util.testWeekAndJiiejiari.weekAndHolidaySuccess;
import org.apache.commons.collections4.CollectionUtils;
import org.javatuples.Pair;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class WeekAndHolidaySuccess {

    public static void main(String[] args) {
        List holidayDataList = new ArrayList<>();
        //获取周
        List weekList = new ArrayList<>();
        Pair weekDays = WeekDaySuccess.getWeekDays(2024);
        Map> daysValueMap = (Map>) weekDays.getValue1();
        for(Map.Entry> mapValue:daysValueMap.entrySet()){
            List mapValueValue = mapValue.getValue();
            if(CollectionUtils.isNotEmpty(mapValueValue)){
                weekList.addAll(mapValueValue);
            }
        }
        if(CollectionUtils.isNotEmpty(weekList)){
            weekList.stream().forEach(item->{
                HolidayData holidayData = new HolidayData();
                holidayData.setDataValue(item);
                holidayData.setType("week");
                holidayData.setTypeName("周末");
                holidayDataList.add(holidayData);
            });
        }
//        JSONArray holidayOfYear = HolidayUtils.getHolidayOfYear("2024");
//        if(null!=holidayOfYear && holidayOfYear.size()>0){
//            for (int i = 0; i < holidayOfYear.size(); i++) {
//                HolidayData holidayData = new HolidayData();
//                JSONObject jsonObject = holidayOfYear.getJSONObject(i);
//                System.out.println(jsonObject.getObject("isOffDay",Boolean.TYPE));
//                boolean anyMatchHoliday = weekList.stream().anyMatch(items -> items.equals(jsonObject.getString("date")) && true==jsonObject.getObject("isOffDay",Boolean.TYPE));
//                if(!anyMatchHoliday){
//                    holidayData.setDataValue(jsonObject.getString("date"));
//                    holidayData.setType("holiday");
//                    holidayDataList.add(holidayData);
//                }
//                boolean anyMatchWeek = weekList.stream().anyMatch(items -> items.equals(jsonObject.getString("date")) && false==jsonObject.getObject("isOffDay",Boolean.TYPE));
//                if(!anyMatchWeek){
//                    holidayData.setDataValue(jsonObject.getString("date"));
//                    holidayData.setType("holiday");
//                    holidayDataList.add(holidayData);
//                }
//            }
//        }
        List holidayValueList = HolidayUtils.getHolidayList("2024");
        if(CollectionUtils.isNotEmpty(holidayValueList)){
            holidayValueList.stream().forEach(holiday->{
                if(true==holiday.getHoliday()){
                    boolean anyMatchHoliday = weekList.stream().anyMatch(items -> items.equals(holiday.getDate()));
                    if(!anyMatchHoliday){
                        HolidayData holidayData = new HolidayData();
                        holidayData.setDataValue(holiday.getDate());
                        holidayData.setType("holiday");
                        holidayData.setTypeName("节假日");
                        holidayDataList.add(holidayData);
                    }
                }else if(false==holiday.getHoliday()){
                    boolean anyMatchWeek = weekList.stream().anyMatch(items -> items.equals(holiday.getDate()));
                    if(anyMatchWeek){
                        HolidayData holidayData = new HolidayData();
                        holidayData.setDataValue(holiday.getDate());
                        holidayData.setType("week");
                        holidayData.setTypeName("周末");
                        holidayDataList.remove(holidayData);
                    }else{
                        HolidayData holidayData = new HolidayData();
                        holidayData.setDataValue(holiday.getDate());
                        holidayData.setType("holiday");
                        holidayData.setTypeName("节假日");
                        holidayDataList.add(holidayData);
                    }
                }
            });
        }
         System.out.println("全部节假日及周末:"+holidayDataList);
        List weekData = holidayDataList.stream().filter(yryt -> "week".equals(yryt.getType())).collect(Collectors.toList());
        System.out.println("全部节周末:"+weekData );
        List holidayData = holidayDataList.stream().filter(yryt -> "holiday".equals(yryt.getType())).collect(Collectors.toList());
        System.out.println("全部节假日:"+holidayData );
    }
}


package com.testwar.util.testWeekAndJiiejiari.weekAndHolidaySuccess;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.javatuples.Pair;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.Period;
import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import static java.time.temporal.TemporalAdjusters.firstInMonth;

/**
 * 获取当前年的星期
 */
public class WeekDaySuccess {

    public static void main(String[] args) {
        Pair weekDays = getWeekDays(2023);
        //System.out.println(weekDays.getValue0());
        System.out.println(weekDays.getValue1());
    }

    public static Pair getWeekDays(int year){
        // 创建代表一年中第一天的LocalDate对象。
        LocalDate now = LocalDate.of(year, Month.JANUARY, 1);
        Map> weekMap = new LinkedHashMap<>(12);
        Map> dateWeekMap = new LinkedHashMap<>(12);
        // 第一个星期六
        LocalDate saturday = now.with(firstInMonth(DayOfWeek.SATURDAY));
        do {
            String satMonth = String.valueOf(saturday.getMonthValue());
            if (CollectionUtils.isEmpty(weekMap.get(satMonth))) {
                weekMap.put(satMonth, new ArrayList<>(Arrays.asList(saturday.getDayOfMonth())));
            } else {
                List values = weekMap.get(satMonth);
                values.add(saturday.getDayOfMonth());
                Collections.sort(values);
                weekMap.put(satMonth, values);
            }
            // 迭代一个星期
            saturday = saturday.plus(Period.ofDays(7));
        } while (saturday.getYear() == year);
        // 第一个星期天
        LocalDate sunday = now.with(firstInMonth(DayOfWeek.SUNDAY));
        do {
            String sunMonth = String.valueOf(sunday.getMonthValue());
            if (CollectionUtils.isEmpty(weekMap.get(sunMonth))) {
                weekMap.put(sunMonth, new ArrayList<>(Arrays.asList(sunday.getDayOfMonth())));
            } else {
                List values = weekMap.get(sunMonth);
                values.add(sunday.getDayOfMonth());
                Collections.sort(values);
                weekMap.put(sunMonth, values);
            }
            // 迭代一个星期
            sunday = sunday.plus(Period.ofDays(7));
        } while (sunday.getYear() == year);

        Map> sortWeekMap = weekMap.entrySet().stream().sorted((e1, e2) ->
                Integer.compare(Integer.parseInt(e1.getKey()), Integer.parseInt(e2.getKey())))
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
        for (Entry> map : sortWeekMap.entrySet()) {
            String date = year + "-" +String.format("%02d",Integer.parseInt(map.getKey().trim()));
            List integerList = map.getValue();
            List weekValue = new ArrayList<>();
            integerList.stream().forEach(week->{
                weekValue.add(date+"-"+String.format("%02d",week));
            });
            dateWeekMap.put(date,weekValue);
        }
        return new Pair(weekMap,dateWeekMap);
    }
}

package com.testwar.util.testWeekAndJiiejiari.weekAndHolidaySuccess;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.testwar.util.testSenMessage.HttpUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

public class HolidayUtils {

    private static final String API_URL = "http://tool.bitefu.net/jiari/?d=";

    /**
     * 请求第三方接口的方法
     * @param url 请求的url
     * @return
     */
    public static String get(String url, int i) {
        // 请求url
        URL getUrl = null;
        // 连接
        HttpURLConnection connection = null;
        // 输入流
        BufferedReader reader = null;
        // 返回结果
        StringBuilder lines = new StringBuilder();
        try {
            // 初始化url
            getUrl = new URL(url);
            // 获取url的连接
            connection = (HttpURLConnection) getUrl.openConnection();
            // 发起连接
            connection.connect();
            // 获取输入流
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));
            // 读取返回结果
            String line = "";
            // 读取每一行
            while ((line = reader.readLine()) != null) {
                // 拼接返回结果
                lines.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
            // 如果请求失败, 尝试重新请求
            if (i < 2) {
                i++;
                try {
                    System.out.println("第" + i + "次获取失败, 尝试重新请求");
                    Thread.sleep(3000);
                    return get(url, i);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            } else {
                System.out.println("获取失败, 请检查网络或稍后重试");
            }
        } finally {
            // 在finally中关闭资源
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                connection.disconnect();
            }
        }
        return lines.toString();
    }

    /**
     * 设置尝试次数
     *
     * @param url
     * @return
     */
    public static String get(String url) {
        return get(url, 0);
    }

    /**
     * 获取指定年份的url
     *
     * @param year 年份
     * @return
     */
    private static String getPath(String year) {
        // 源json地址
        //return "https://raw.githubusercontent.com/NateScarlet/holiday-cn/master/" + year + ".json";
        // 国内镜像地址
        //return "https://natescarlet.coding.net/p/github/d/holiday-cn/git/raw/master/" + year + ".json";
        // cdn地址
        return "https://cdn.jsdelivr.net/gh/NateScarlet/holiday-cn@master/" + year + ".json";
    }

    /**
     * 获取指定年份的节假日信息
     *
     * @param year 年份 如:"2022"
     * @return
     */
    public static JSONArray getHolidayOfYear(String year) {
        // 获取指定年份的url
        String url = getPath(year);
        // 获取返回结果
        String json = get(url);
        // 解析返回结果
        JSONObject jsonObject = JSONObject.parseObject(json);
        JSONArray jsonArray = jsonObject.getJSONArray("days");
        return jsonArray;
    }

    /**
     * 获取某年所有节假日信息
     */
    public static List allHoliday(String yearStr) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String res = get(yearStr);
        JSONObject jsonObject = JSONObject.parseArray(res).getJSONObject(0);
        List all = new ArrayList<>();
        Set daySet = jsonObject.keySet();
        for (String s : daySet) {
            all.add(dateFormat.format(yearStr + s));
        }
        return all;
    }

    /**
     * 节假日api
     *
     * @param dateStr 日期字符串
     * @return
     */
    private static String getS(String dateStr) {
        return HttpUtils.get(API_URL + dateStr,null,null);
    }

    /**
     * 获取指定日期的节假日信息
     *
     * @param date 日期 如:"2022-04-05"
     * @return 如果是节假日, 则isOffDay为true, 否则为false
     */
    public static JSONObject getHolidayOfDate(String date) {
        // 获取该年份的节假日信息
        JSONArray jsonArray = getHolidayOfYear(date.substring(0, 4));
        JSONObject result = new JSONObject();
        // 遍历节假日信息
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            // 如果节假日信息中的日期与传入的日期相同,则返回该节假日信息
            if (jsonObject.getString("date").equals(date)) {
                result = jsonObject;
            }
        }
        if (result.isEmpty()) {
            // 如果没有找到该日期的节假日信息,则将该日期的"isOffDay"设置为false
            result.put("date", date);
            result.put("isOffDay", false);
        }
        return result;
    }

    /**
     * 判断日期是否节假日的方法
     *
     * @param date 日期 如:"2022-04-05"
     */
    public static boolean isHoliday(String date) {
        // 获取该年份的节假日信息
        JSONArray jsonArray = getHolidayOfYear(date.substring(0, 4));
        // 遍历节假日信息
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            // 如果传入的日期存在于该年的节假日中,则返回对应的节假日信息(true为节假日, false为调休工作日)
            if (jsonObject.getString("date").equals(date)) {
                return jsonObject.getBoolean("isOffDay");
            }
        }
        // 如果不存在, 则直接返回false(非节假日)
        return false;
    }

    /**
     * 获取指定Date的节假日信息
     *
     * @param date
     * @return
     */
    public static JSONObject getHolidayOfDate(Date date) {
        // 将Date格式化为String
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return getHolidayOfDate(sdf.format(date));
    }

    /**
     * 判断指定Date是否节假日
     *
     * @param date
     * @return
     */
    public static boolean isHoliday(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return isHoliday(sdf.format(date));
    }

    /**
     * 获取从指定日期开始的节假日天数
     *
     * @param date
     * @return
     */
    public static int holidayAfterDate(String date, SimpleDateFormat sdf) {
        // 日历类
        Calendar calendar = Calendar.getInstance();
        JSONArray holidayOfYear = getHolidayOfYear(date.substring(0, 4));
        int days = 0;
        try {
            calendar.setTime(sdf.parse(date));
            for (int i = 0; i < holidayOfYear.size(); i++) {
                JSONObject jsonObject = holidayOfYear.getJSONObject(i);
                if (jsonObject.getString("date").equals(date) && jsonObject.getBoolean("isOffDay")) {
                    days++;
                    calendar.add(Calendar.DATE, 1);
                    date = sdf.format(calendar.getTime());
                }
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return days;
    }

    public static int holidayAfterDate(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return holidayAfterDate(date, sdf);
    }

    public static int holidayAfterDate(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return holidayAfterDate(sdf.format(date), sdf);
    }

    /**
     * 获取节假日,成功
     * @param year
     * @return
     */
    public static List getHolidayList(String year){
        List holidayList = new ArrayList<>();
        String data = HttpUtils.get("http://timor.tech/api/holiday/year/"+year+"?type=Y&week=Y",null,null);
        JSONObject parseObject = JSONObject.parseObject(data);
        Map parseObjectObject = parseObject.getObject("holiday", Map.class);
        for(Map.Entry mapValue:parseObjectObject.entrySet()){
            JSONObject mapValueValue = mapValue.getValue();
            if(null!=mapValueValue){
                HolidayValue holidayValue = JSONObject.parseObject(JSON.toJSONString(mapValueValue, SerializerFeature.WriteMapNullValue),HolidayValue.class);
                if(null!=holidayValue){
                    holidayList.add(holidayValue);
                }
            }
        }
        List holidayValueList = holidayList.stream().sorted(Comparator.comparing(HolidayValue::getDate, Comparator.nullsLast(String::compareTo))).collect(Collectors.toList());
        return holidayValueList;
    }

    // 测试
    public static void main(String[] args) {
        List holidayList = new ArrayList<>();
        List holidayNoList = new ArrayList<>();
        String data = HttpUtils.get("http://timor.tech/api/holiday/year/2024?type=Y&week=Y",null,null);
        JSONObject parseObject = JSONObject.parseObject(data);
        Map parseObjectObject = parseObject.getObject("holiday", Map.class);
        for(Map.Entry mapValue:parseObjectObject.entrySet()){
            JSONObject mapValueValue = mapValue.getValue();
            if(null!=mapValueValue){
                HolidayValue holidayValue = JSONObject.parseObject(JSON.toJSONString(mapValueValue, SerializerFeature.WriteMapNullValue),HolidayValue.class);
                if(null!=holidayValue){
                    if(true==holidayValue.getHoliday()){
                        holidayList.add(holidayValue);
                    }else{
                        holidayNoList.add(holidayValue);
                    }
                }
            }
        }
        List holidayValueList = holidayList.stream().sorted(Comparator.comparing(HolidayValue::getDate, Comparator.nullsLast(String::compareTo))).collect(Collectors.toList());
        System.out.println(holidayValueList.size()+"值:"+holidayValueList);
        List holidayNoValueList = holidayNoList.stream().sorted(Comparator.comparing(HolidayValue::getDate, Comparator.nullsLast(String::compareTo))).collect(Collectors.toList());
        System.out.println(holidayNoValueList.size()+"值:"+holidayNoValueList);
//        System.out.println(allHoliday("2024"));
//        System.out.println("2022年的节假日: " + getHolidayOfYear("2024"));
//        System.out.println("节假日的信息: " + getHolidayOfDate("2022-04-05"));
//        System.out.println("节假日调休工作日: " + getHolidayOfDate("2022-04-02"));
//        System.out.println("非节假日的信息: " + getHolidayOfDate("2022-04-07"));
//        System.out.println("判断一个节假日: " + isHoliday("2022-04-05"));
//        System.out.println("判断一个非节假日: " + isHoliday("2022-04-07"));
//        System.out.println("自一个节假日起的节假日天数: " + holidayAfterDate("2022-04-04"));
//        System.out.println("自非节假日起的节假日天数: " + holidayAfterDate("2022-04-06"));
    }
}


package com.testwar.util.testWeekAndJiiejiari.weekAndHolidaySuccess;
import lombok.Data;

@Data
public class HolidayValue {

    private String date;//日期
    private String name;//名称
    private Boolean holiday;//是否为节假日
    private String target;//描述
}

package com.testwar.util.testWeekAndJiiejiari.weekAndHolidaySuccess;
import lombok.Data;

@Data
public class HolidayData {
    private String dataValue;//日期
    private String type;// 类型
    private String typeName;// 类型名称
}

你可能感兴趣的:(获取周末,获取节假日)