聚合数据-万年历工具类-Java
程序员文章站
2022-05-04 08:54:35
聚合数据-万年历工具类,可实现 1. 查询近期假期 2. 查询某天详细信息 3. 判断某天是否是假期或休息日,基于聚合数据完成,编程语言:java...
聚合数据-万年历工具类
简述
此工具通过对接聚合数据,可实现一些日历基本操作,实现功能需调用 聚合数据-万年历接口(每年的节假日根据情况会有所调整),此接口为 免费接口,每天可调用量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