欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

聚合数据-万年历工具类-Java

程序员文章站 2022-10-04 09:48:09
聚合数据-万年历工具类,可实现 1. 查询近期假期 2. 查询某天详细信息 3. 判断某天是否是假期或休息日,基于聚合数据完成,编程语言:java...

简述

此工具通过对接聚合数据,可实现一些日历基本操作,实现功能需调用 聚合数据-万年历接口(每年的节假日根据情况会有所调整),此接口为 免费接口每天可调用量100次
java环境:jdk 8,jar包使用maven进行导入,下方有提供使用的maven jar包配置

聚合数据万年历接口

我认证的个人号,每天免费调用100次, 万年历接口申请点这里.
图示: 聚合数据-万年历工具类-Java

Maven jar包支持

<!--阿里 fastjson-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.70</version>
</dependency>
<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>
<!-- hutool工具类包 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.2.3</version>
</dependency>

工具类能力列表

1. 查询近期假期
2. 查询某天详细信息
3. 判断某天是否是假期或休息日

1. 查询近期假期

  /**
   * 调用日历接口查询 近期假期
   * @param date 某月日期
   * @return com.centling.snake.ufan.personal.juhe.CalendarUtil.NearHoliday
   * @author ChenXueSong
   * @datetime 2020/7/14 14:46
   */
  public static NearHoliday findNearHoliday(Date date) {
      String param = DateUtil.format(date, "yyyy-M");
      String result = HttpUtil.get(NEAR_HOLIDAY_URL + "?year-month="+ param +"&key=" + KEY);
      // 获取日历 Data
      JSONObject data = resolvingResult(result);
      if (data == null) {
          return null;
      }
      return JSON.toJavaObject(data, NearHoliday.class);
  }

2. 查询某天详细信息

 /**
  * 调用日历接口查询 某天详细信息
  * @param date 日期
  * @return com.centling.snake.ufan.personal.juhe.CalendarUtil.CalendarDate
  * @author ChenXueSong
  * @datetime 2020/7/14 12:03
  */
 public static CalendarDate findCalendarDate(Date date) {
     String param = DateUtil.format(date, "yyyy-M-d");
     String result = HttpUtil.get(CALENDAR_DAY_URL + "?date="+ param +"&key=" + KEY);
     // 获取日历 Data
     JSONObject data = resolvingResult(result);
     if (data == null) {
         return null;
     }
     return JSON.toJavaObject(data, CalendarDate.class);
 }

3. 判断某天是否是假期或休息日

此方法依赖于 查询近期假期 方法支持进行实现,也可单独拆分成 是否为假期是否是休息日 两个方法

 /**
  * 判断某天是否是 节假日 休息日
  * @param date 日期
  * @return boolean 是 true 否 false
  * @author ChenXueSong
  * @datetime 2020/7/14 11:24
  */
 public static boolean isHolidayAndRestDay(Date date) {
     // 调用查询近期节假日
     NearHoliday nearHoliday =  findNearHoliday(date);
     if (nearHoliday == null) {
         return true;
     }
     String param = DateUtil.format(date, "yyyy-M-d");
     // 节假日数组 不为 null 数组长度 大于 0
     if (nearHoliday.getHolidayArray() != null && nearHoliday.getHolidayArray().size() > 0) {
         // 循环遍历 近期假期
         for (Holiday holiday: nearHoliday.getHolidayArray()) {
             // 循环遍历 假期中的 日期,判断是 假期 还是 上班
             for (HolidayDay holidayDay: holiday.getList()) {
                 if (param.equals(holidayDay.getDate())) {
                     // 日期状态 为 1 是假期日,为 2 是 上班日
                     return holidayDay.getStatus().compareTo(1) == 0;
                 }
             }
         }
     }
     // 一周天
     String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
     // 休息日
     String[] restDays = new String[] {"星期六", "星期日"};
     // 设置日期
     Calendar calendar= Calendar.getInstance();
     calendar.setTime(date);
     for (String day: restDays) {
         // 比较今天 是否是 休息日
         if (day.equals(weekDays[calendar.get(Calendar.DAY_OF_WEEK)-1])) {
             return true;
         }
     }
     return false;
 }

整体代码类

package com.centling.snake.ufan.personal.juhe;

import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 聚合数据-万年历工具类
 * @author ChenXueSong
 * @datetime 2020/7/14 11:20
 */
public class CalendarUtil {
    /**
     * 聚合数据 key
     */
    private static final String KEY = "填写自己申请的appkey";
    /**
     * 万年历接口 某天详细 URL
     */
    private static final String CALENDAR_DAY_URL = "http://v.juhe.cn/calendar/day";
    /**
     * 万年历接口 近期假期 URL
     */
    private static final String NEAR_HOLIDAY_URL = "http://v.juhe.cn/calendar/month";

    /**
     * 判断某天是否是 节假日 休息日
     * @param date 日期
     * @return boolean 是 true 否 false
     * @author ChenXueSong
     * @datetime 2020/7/14 11:24
     */
    public static boolean isHolidayAndRestDay(Date date) {
        // 调用查询近期节假日
        NearHoliday nearHoliday =  findNearHoliday(date);
        if (nearHoliday == null) {
            return true;
        }
        String param = DateUtil.format(date, "yyyy-M-d");
        // 节假日数组 不为 null 数组长度 大于 0
        if (nearHoliday.getHolidayArray() != null && nearHoliday.getHolidayArray().size() > 0) {
            // 循环遍历 近期假期
            for (Holiday holiday: nearHoliday.getHolidayArray()) {
                // 循环遍历 假期中的 日期,判断是 假期 还是 上班
                for (HolidayDay holidayDay: holiday.getList()) {
                    if (param.equals(holidayDay.getDate())) {
                        // 日期状态 为 1 是假期日,为 2 是 上班日
                        return holidayDay.getStatus().compareTo(1) == 0;
                    }
                }
            }
        }
        // 一周天
        String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        // 休息日
        String[] restDays = new String[] {"星期六", "星期日"};
        // 设置日期
        Calendar calendar= Calendar.getInstance();
        calendar.setTime(date);
        for (String day: restDays) {
            // 比较今天 是否是 休息日
            if (day.equals(weekDays[calendar.get(Calendar.DAY_OF_WEEK)-1])) {
                return true;
            }
        }
        return false;
    }

    /**
     * 调用日历接口查询 某天详细信息
     * @param date 日期
     * @return com.centling.snake.ufan.personal.juhe.CalendarUtil.CalendarDate
     * @author ChenXueSong
     * @datetime 2020/7/14 12:03
     */
    public static CalendarDate findCalendarDate(Date date) {
        String param = DateUtil.format(date, "yyyy-M-d");
        String result = HttpUtil.get(CALENDAR_DAY_URL + "?date="+ param +"&key=" + KEY);
        // 获取日历 Data
        JSONObject data = resolvingResult(result);
        if (data == null) {
            return null;
        }
        return JSON.toJavaObject(data, CalendarDate.class);
    }

    /**
     * 调用日历接口查询 近期假期
     * @param date 某月日期
     * @return com.centling.snake.ufan.personal.juhe.CalendarUtil.NearHoliday
     * @author ChenXueSong
     * @datetime 2020/7/14 14:46
     */
    public static NearHoliday findNearHoliday(Date date) {
        String param = DateUtil.format(date, "yyyy-M");
        String result = HttpUtil.get(NEAR_HOLIDAY_URL + "?year-month="+ param +"&key=" + KEY);
        // 获取日历 Data
        JSONObject data = resolvingResult(result);
        if (data == null) {
            return null;
        }
        return JSON.toJavaObject(data, NearHoliday.class);
    }

    /**
     * 解析聚合数据接口返回 json 字符串 转换为 jsonObject
     * @param result json 字符串
     * @return com.alibaba.fastjson.JSONObject
     * @author ChenXueSong
     * @datetime 2020/7/14 15:54
     */
    public static JSONObject resolvingResult(String result) {
        if (StringUtils.isBlank(result)) {
            // 接口返回异常
            return null;
        }
        JSONObject jsonObject = JSON.parseObject(result);
        // 接口状态码,返回异常
        if (jsonObject.getInteger("error_code").compareTo(0) != 0) {
            return null;
        }
        return jsonObject.getJSONObject("result").getJSONObject("data");
    }

    /**
     * 日历信息-内部类
     */
    @Data
    private static class CalendarDate {
        /** 假日 */
        private String holiday;
        /** 属相 */
        private String animalsYear;
        /** 忌 */
        private String avoid;
        /** 假日描述 */
        private String desc;
        /** 周几 */
        private String weekday;
        /** 宜 */
        private String suit;
        /** 纪年 */
        private String lunarYear;
        /** 农历 */
        private String lunar;
        /** 年份和月份 */
        @JSONField(name = "year-month")
        private String yearMonth;
        /** 具体日期 */
        private String date;
    }

    /**
     * 近期假期
     */
    @Data
    private static class NearHoliday {
        /** 年份 */
        private String year;
        /** 年份和月份 */
        @JSONField(name = "year-month")
        private String yearMonth;
        /** 当月近期假日 */
        private String holiday;
        /** 当月近期假期(数组类型) */
        @JSONField(name = "holiday_array")
        private List<Holiday> holidayArray;
    }

    /**
     * 假期
     */
    @Data
    private static class Holiday {
        /** 假期名 */
        private String name;
        /** 假期第一天日期 */
        private String festival;
        /** 描述 */
        private String desc;
        /** 休息建议 */
        private String rest;
        /** 放假天数 */
        @JSONField(name = "list_num")
        private Long listNum;
        /** 假期日期 list */
        private List<HolidayDay> list;
    }

    /**
     * 假期日
     */
    @Data
    private static class HolidayDay {
        /** 日期 */
        private String date;
        /** 状态 1:放假, 2:上班 */
        private Integer status;
    }

    public static void main(String[] args) {
        Date date = DateUtil.parse("2020-10-8", "yyyy-MM-dd");
        System.out.println(CalendarUtil.isHolidayAndRestDay(date));
    }
}

尾语

这个工具类,有需要继续维护,希望这个工具类可以帮到你,同时本文为原创文章,转载请标明出处,谢谢

本文地址:https://blog.csdn.net/CXS12169/article/details/107370963