发布时间:2025-12-09 20:35:36 浏览次数:4
API:(需要传年份月份)
/*** 百度节假日接口*/String BAIDU_HOLIDAY_URL = "http://opendata.baidu.com/api.php?query=YEAR_MONTH&resource_id=6018&format=json";/*** 百度万年历接口*/String BAIDU_CALENDAR_URL = "http://opendata.baidu.com/api.php?query=YEAR_MONTH&resource_id=39043&format=json&tn=wisetpl";返回的json转对象
private static RestTemplate restTemplate = new RestTemplate();private static SimpleDateFormat format = new SimpleDateFormat("yyyy-M-d");private static SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");/*** 根据日历获取节假日信息** @param yearMonth* @return*/public static List<BaiduHolidayInfo> queryHolidaysByAlmanac(String yearMonth) {List<BaiduHolidayInfo> holidays = null;List<BaiduAlmanacInfo> almanacs = new ArrayList<>();Integer year = Integer.parseInt(yearMonth.substring(0, 4));if (yearMonth.contains("月")) {Integer month = Integer.parseInt(yearMonth.substring(5, yearMonth.indexOf("月")));almanacs = queryAlmanacs(year, month);} else {for (int i = 0; i < 12; i++) {almanacs.addAll(queryAlmanacs(year, i));}}holidays = convert(almanacs);return holidays;}/*** 获取对应的年月份周围的日历信息** @param year* @param month* @return*/public static List<BaiduAlmanacInfo> queryAlmanacs(Integer year, Integer month) {String yearMonth = year + "年" + month + "月";String url = HolidayUrlConstant.BAIDU_CALENDAR_URL.replace("YEAR_MONTH", yearMonth);JSONObject result = JSONObject.parseObject(restTemplate.getForObject(url, String.class));List<BaiduAlmanacInfo> almanacs = resolveAlmanac(result);List<BaiduAlmanacInfo> resultList = new ArrayList<>();almanacs.forEach(oldAlmanac -> {if (year.equals(Integer.parseInt(oldAlmanac.getYear()))&& month.equals(Integer.parseInt(oldAlmanac.getMonth()))) {resultList.add(oldAlmanac);}});return resultList;}/*** 解析百度日历接口返回的json对象** @param jsonObject* @return*/private static List<BaiduAlmanacInfo> resolveAlmanac(JSONObject jsonObject) {List<BaiduAlmanacInfo> almanacs = new ArrayList<>();try {if ("0".equalsIgnoreCase(jsonObject.getString("status"))) {JSONArray data = jsonObject.getJSONArray("data");if (!CollectionUtils.isEmpty(data)) {JSONObject item = data.getJSONObject(0);if (item == null || item.get("almanac") == null) {return almanacs;}JSONArray jsonArray = item.getJSONArray("almanac");if (!CollectionUtils.isEmpty(jsonArray)) {for (int i = 0; i < jsonArray.size(); i++) {JSONObject h = jsonArray.getJSONObject(i);String oDateStr = h.getString("oDate");String animalStr = h.getString("animal");String avoidStr = h.getString("avoid");String yearStr = h.getString("year");String monthStr = h.getString("month");String dayStr = h.getString("day");String suitStr = h.getString("suit");String statusStr = h.getString("status");String dateStr = yearStr + "-" + monthStr + "-" + dayStr;oDateStr = format1.format(format.parse(dateStr));// 生成对象BaiduAlmanacInfo almanac = BaiduAlmanacInfo.builder().animal(animalStr).avoid(avoidStr).day(dayStr).month(monthStr).oDate(oDateStr).year(yearStr).suit(suitStr).status(Integer.parseInt(StringUtils.isBlank(statusStr) ? "0" : statusStr)).build();almanacs.add(almanac);}}}}} catch (Exception e) {log.error("resolveAlmanac is error");throw new RuntimeException(e);}return almanacs;}/*** 解析百度接口返回的json对象** @param jsonObject* @return*/private static List<BaiduHolidayInfo> resolveHoliday(JSONObject jsonObject) {List<BaiduHolidayInfo> holidays = new ArrayList<>();try {if ("0".equalsIgnoreCase(jsonObject.getString("status"))) {JSONArray data = jsonObject.getJSONArray("data");if (!CollectionUtils.isEmpty(data)) {JSONObject item = data.getJSONObject(0);if (item == null || item.get("holiday") == null) {return holidays;}JSONArray jsonArray = item.getJSONArray("holiday");if (!CollectionUtils.isEmpty(jsonArray)) {for (int i = 0; i < jsonArray.size(); i++) {JSONObject h = jsonArray.getJSONObject(i);JSONArray hh = h.getJSONArray("list");String descStr = h.getString("desc");String nameStr = h.getString("name");String festivalStr = h.getString("festival");String restStr = h.getString("rest");String num = h.getString("list#num#baidu");if (!CollectionUtils.isEmpty(hh)) {for (int j = 0; j < hh.size(); j++) {JSONObject hhh = hh.getJSONObject(j);String dateStr = hhh.getString("date");String statusStr = hhh.getString("status");dateStr = format1.format(format.parse(dateStr));// 生成对象BaiduHolidayInfo holiday = BaiduHolidayInfo.builder().name(nameStr).desc(descStr).date(dateStr).status(Integer.valueOf(statusStr)).festival(festivalStr).rest(restStr).num(Integer.valueOf(num)).build();holidays.add(holiday);}}}}}}} catch (Exception e) {log.error("resolve is error");throw new RuntimeException(e);}return holidays;}/*** 转换** @param almanacs* @return*/private static List<BaiduHolidayInfo> convert(List<BaiduAlmanacInfo> almanacs) {List<BaiduHolidayInfo> baiduHolidays = new ArrayList<>();if (CollectionUtils.isEmpty(almanacs)) {return baiduHolidays;}almanacs.forEach(almanac -> {Integer status = almanac.getStatus();if (status != null) {String name = "";if(status.equals(0)){return;}if (status.equals(1)) {name = "法定假日";} else if (status.equals(2)) {name = "补班";}baiduHolidays.add(BaiduHolidayInfo.builder().name(name).rest(almanac.getSuit()).date(almanac.getODate()).status(status).build());}});return baiduHolidays;}对应的BO
//万年历public class BaiduAlmanacInfo {/*** 生肖*/private String animal;/*** 忌讳*/private String avoid;/*** 天*/private String day;/*** 月份*/private String month;/*** 日期*/private String oDate;/*** 年份*/private String year;/*** 适宜*/private String suit;/*** 状态* 1:代表休息* 2:代表补休*/private Integer status;/*** 影响天数,包含补班天数*/private Integer num;}//节假日public class BaiduHolidayInfo {/*** 名称*/private String name;/*** 建议*/private String rest;/*** 日期*/private String date;/*** 状态* 1:代表休息* 2:代表补休*/private int status;/*** 描述*/private String desc;/*** 开始日期*/private String festival;/*** 影响天数,包含补班天数*/private int num;}