目录
1.1.使用http://tool.bitefu.net/jiari
1.使用第三方接口
优点:代码量小,缺点:第三方服务关闭导致自己的功能不可用
1.1.使用http://tool.bitefu.net/jiari
public BaseResult<Boolean> isHoliday(LocalDate localDate) {
log.info("isHoliday_param={}", localDate);
//示例:http://tool.bitefu.net/jiari/?d=2021-09-19
//注意:第三方api,该链接有可能失效
//返回值:0 上班 1周末 2节假日
try {
RestTemplate restTemplate = new RestTemplate();
String httpUrl = "http://tool.bitefu.net/jiari/?d=" + localDate;
Integer result = restTemplate.getForObject(httpUrl, Integer.class);
log.info("isHoliday_result={}", JSONUtil.toJsonStr(result));
return BaseResult.ok(0 == result);
} catch (Exception e) {
log.error("isHoliday_error!", e);
if (DayOfWeek.SATURDAY.equals(localDate.getDayOfWeek()) || DayOfWeek.SUNDAY.equals(localDate.getDayOfWeek())) {
return BaseResult.ok(Boolean.FALSE);
}
return BaseResult.ok(Boolean.TRUE);
}
}
1.2.使用百度日历
//万年历
@Builder
@Data
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;
/**
* 周六日
*/
private String cnDay;
}
/**
* 获取对应的年月份周围的日历信息
*
* @return
*/
public Boolean queryAlmanacs(LocalDate localDate) {
log.info("queryAlmanacs_param={}", localDate);
try {
RestTemplate restTemplate = new RestTemplate();
String year = String.valueOf(localDate.getYear());
String month = String.valueOf(localDate.getMonthValue());
String day = String.valueOf(localDate.getDayOfMonth());
String url = "http://opendata.baidu.com/api.php?query=" + year + "年" + month + "月&resource_id=39043&format=json&tn=wisetpl";
JSONObject result = JSONObject.parseObject(restTemplate.getForObject(url, String.class));
log.info("queryAlmanacs_result={}", JSONUtil.toJsonStr(result));
List<BaiduAlmanacInfo> almanacs = resolveAlmanac(result);
for (BaiduAlmanacInfo oldAlmanac : almanacs) {
//状态等于1为节假日,等于2为补班
if (year.equals(oldAlmanac.getYear()) && month.equals(oldAlmanac.getMonth()) && day.equals(oldAlmanac.getDay())) {
if (oldAlmanac.getStatus() == null) {
return "六".equals(oldAlmanac.getCnDay()) || "日".equals(oldAlmanac.getCnDay()) ? Boolean.TRUE : Boolean.FALSE;
} else {
return 1 == oldAlmanac.getStatus() ? Boolean.FALSE : Boolean.TRUE;
}
}
}
return Boolean.FALSE;
} catch (Exception e) {
log.error("queryAlmanacs_error!", e);
if (!DayOfWeek.SATURDAY.equals(localDate.getDayOfWeek()) && !DayOfWeek.SUNDAY.equals(localDate.getDayOfWeek())) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
}
/**
* 解析百度日历接口返回的json对象
*
* @param jsonObject
* @return
*/
private 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 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");
// 生成对象
BaiduAlmanacInfo almanac = BaiduAlmanacInfo.builder().animal(animalStr).avoid(avoidStr)
.day(dayStr).month(monthStr).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;
}
2.数据库建数据表,手动维护表内容
CREATE TABLE `calendar_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`calendar_date` varchar(100) DEFAULT NULL COMMENT '日期',
`calendar_type` int(2) DEFAULT NULL COMMENT '日期类型 0:工作日 1节假日 2补班',
`cn_day` varchar(100) DEFAULT NULL COMMENT '周六日',
`calendar_detail` varchar(100) DEFAULT NULL COMMENT '备注',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_upd_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uniq_index_calendar_info` (`calendar_date`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2408 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='日历信息表'
@Data
@TableName("calendar_info")
@Builder
public class CalendarInfo {
@TableId(value = "id",type = IdType.AUTO)
private Long id;
private String calendarDate;
private Integer calendarType;
private String calendarDetail;
private String createTime;
private String lastUpdTime;
private String cnDay;
}
public BaseResult<Boolean> isHolidayInfo(LocalDate localDate) {
log.info("queryAlmanacs_param={}", localDate);
try {
CalendarInfo calendarInfo = calendarInfoService.getOne(Wrappers.lambdaQuery(CalendarInfo.class).eq(CalendarInfo::getCalendarDate, localDate));
if (calendarInfo == null) {
List<CalendarInfo> resrltCalendarInfos = new ArrayList<>();
List<Integer> list = Arrays.asList(2, 5, 8, 11);
list.forEach(o -> {
resrltCalendarInfos.addAll(resolveCalendarInfo(String.valueOf(localDate.getYear()), String.valueOf(o)));
});
calendarInfoService.saveBatch(resrltCalendarInfos);
for (CalendarInfo resrltCalendarInfo : resrltCalendarInfos) {
if (localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")).equals(resrltCalendarInfo.getCalendarDate())) {
calendarInfo = resrltCalendarInfo;
}
}
}
if (calendarInfo.getCalendarType() == null) {
return "六".equals(calendarInfo.getCnDay()) || "日".equals(calendarInfo.getCnDay()) ? BaseResult.ok(Boolean.TRUE) : BaseResult.ok(Boolean.FALSE);
} else {
return 1 == calendarInfo.getCalendarType() ? BaseResult.ok(Boolean.FALSE) : BaseResult.ok(Boolean.TRUE);
}
} catch (Exception e) {
log.error("isHoliday_error!", e);
if (DayOfWeek.SATURDAY.equals(localDate.getDayOfWeek()) || DayOfWeek.SUNDAY.equals(localDate.getDayOfWeek())) {
return BaseResult.ok(Boolean.FALSE);
}
return BaseResult.ok(Boolean.TRUE);
}
}
private List<CalendarInfo> resolveCalendarInfo(String year, String month) {
RestTemplate restTemplate = new RestTemplate();
String url = "http://opendata.baidu.com/api.php?query=" + year + "年" + month + "月&resource_id=39043&format=json&tn=wisetpl";
JSONObject result = JSONObject.parseObject(restTemplate.getForObject(url, String.class));
System.out.println("result = " + result);
List<CalendarInfo> calendarInfos = new ArrayList<>();
try {
if ("0".equalsIgnoreCase(result.getString("status"))) {
JSONArray data = result.getJSONArray("data");
if (!CollectionUtils.isEmpty(data)) {
JSONObject item = data.getJSONObject(0);
if (item == null || item.get("almanac") == null) {
return calendarInfos;
}
JSONArray jsonArray = item.getJSONArray("almanac");
if (!CollectionUtils.isEmpty(jsonArray)) {
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject h = jsonArray.getJSONObject(i);
String calendarDate = h.getString("year") + "-" + (h.getInteger("month") > 9 ? h.getString("month") : "0" + h.getString("month")) + "-" + (h.getInteger("day") > 9 ? h.getString("day") : "0" + h.getString("day"));
String calendarType = h.getString("status");
String calendarDetail = h.getString("term");
String cnDay = h.getString("cnDay");
// 生成对象
CalendarInfo calendarInfo = CalendarInfo.builder().calendarDate(calendarDate).cnDay(cnDay).calendarType(StringUtils.isBlank(calendarType) ? null : Integer.valueOf(calendarType))
.calendarDetail(calendarDetail).build();
calendarInfos.add(calendarInfo);
}
}
}
}
} catch (Exception e) {
log.error("resolveCalendarInfo is error");
throw new RuntimeException(e);
}
return calendarInfos;
}