可以判断给定日期是否是工作日,以及两个日期间的工作日天数;该工具类依赖于Redis数据库,需要将整个年份的假期时间表存放到Redis中;假期时间表依赖于第三方接口。
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.beicai.compliance.util.redis.RedisUtil;
import org.elasticsearch.common.Strings;
import org.springframework.util.CollectionUtils;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.*;
public class HolidayUtil {
// redis key格式前缀 -> calendar:workOrHolidays:year:month:day: + 1/2 1工作日 2假日
private static final String CALENDAR_WORKORHOLIDAYS = "calendar:workOrHolidays:";
private HolidayUtil() {
}
public static boolean isWeekend() {
return isWeekend(LocalDate.now());
}
public static boolean isWeekend(LocalDate date) {
DayOfWeek dayOfWeek = date.getDayOfWeek();
return DayOfWeek.SATURDAY.equals(dayOfWeek) || DayOfWeek.SUNDAY.equals(dayOfWeek);
}
public static boolean isHolidaysAndFestivals() {
return !isWorkday();
}
public static boolean isHolidaysAndFestivals(LocalDate date) {
return !isWorkday(date);
}
public static boolean isWorkday() {
return isWorkday(LocalDate.now());
}
public static boolean isWorkday(LocalDate date) {
if (date == null) {
return false;
}
String[] split = date.toString().split("-");
String s = RedisUtil.get(CALENDAR_WORKORHOLIDAYS + split[0] + ":" + split[1] + ":" + split[2]);
if (s == null) {
saveCalendarToRedis(date);
s = RedisUtil.get(CALENDAR_WORKORHOLIDAYS + date.getYear() + ":" + date.getMonth() + ":" + date.getDayOfMonth());
}
return Objects.equals(s, "1");
}
// 拉取第三方假期时间表
private static void saveCalendarToRedis(LocalDate date) {
String url = "https://api.apihubs.cn/holiday/get?field=date,workday&year=" + date.getYear() + "&size=366";
String body = HttpRequest.get(url).execute().body();
HashMap bodyResult =
JSON.parseObject(body, new TypeReference>() {});
HashMap dataResult =
JSON.parseObject(bodyResult.get("data"), new TypeReference>() {});
List 


