当前位置: 移动技术网 > IT编程>开发语言>Java > 聚合数据-万年历工具类-Java

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

2020年07月16日  | 移动技术网IT编程  | 我要评论

简述

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

聚合数据万年历接口

我认证的个人号,每天免费调用100次, 万年历接口申请点这里.
图示: 在这里插入图片描述

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网