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;
}