在平时的业务需求中,难免会遇到需要获取一年中所有的工作日,或者跳过所有节假日(包括周末和法定节假日) 的情况。
判断是否周末很简单,但是法定节假日怎么办呢?
这里借助一个开源的网站(https://timor.tech/api/holiday/year/{year})写一个工具类。这里的{year}传一个年份进去即可查询本年度所有的法定节假日,如:https://timor.tech/api/holiday/year/2024就是查询2024年度所有法定节假日。
可以在浏览器上访问试一下
在代码中对这个网址进行http请求,话不多说,直接上代码:
//节假日url
public static String SYNC_ADDRESS = "https://timor.tech/api/holiday/year/";
//假期
static Map<String, List<String>> holiday = new HashMap<>();
//调休日
static Map<String, List<String>> extraWorkDay = new HashMap<>();
/**
* @param date 日期参数 格式‘yyyy’,不传参则默认当前日期
* @return 自己定义,我这里作为案例使用的是yes和no
*/
public static String getYearHoliday(String date) throws ParseException {
try {
//http请求
String result = HttpUtils.sendGet(SYNC_ADDRESS + date);
//字符串转json
JSONObject json = JSONUtil.parseObj(result);
//根据holiday字段获取jsonObject内容
JSONObject holiday = json.getJSONObject("holiday");
//如果获取不到key则不存在节假日,return
if (holiday.size() == 0) {
return "No!";
}
//定义list,后续作为value存放到全局变量中
List hoList = new ArrayList<>();
List extraList = new ArrayList<>();
//遍历holiday的value
for (Map.Entry<String, Object> entry : holiday.entrySet()) {
String value = entry.getValue().toString();
JSONObject jsonObject = JSONUtil.parseObj(value);
String hoBool = jsonObject.getStr("holiday");
String extra = jsonObject.getStr("date");
//判断不是假期后调休的班
if (hoBool.equals("true")) {
hoList.add(extra);
holiday.put(date, hoList);
} else {
extraList.add(extra);
extraWorkDay.put(date, extraList);
}
}
} catch (Exception e) {
e.printStackTrace();
return "No!";
}
return "Yes!";
}
//判断日期类型:0:工作日,1.周末,2.法定节假日
/**
* @param time 日期参数 格式‘yyyy-MM-dd’,不传参则默认当前日期
* @return String 0:工作日,1.周末,2.法定节假日
*/
public static String isWorkingDay(String time) throws ParseException {
Date parse = null;
//为空则返回当前时间
if (StringUtils.isNotBlank(time)) {
SimpleDateFormat getYearFormat = new SimpleDateFormat("yyyy-MM-dd");
parse = getYearFormat.parse(time);
} else {
parse = new Date();
}
String newDate = new SimpleDateFormat("yyyy").format(parse);
//判断key是否有参数年份
//考虑年底需要获取跨年后的数据,所以要获取下一年的所有节假日情况
if (!holiday.containsKey(newDate)) {
String holiday = getYearHoliday(newDate);
getYearHoliday(String.valueOf(Integer.parseInt(newDate) + 1));
if ("No!".equals(holiday)) {
return "该年份未分配日期安排!";
}
}
//得到日期是星期几
Date date = DateUtil.parseDate(time);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int weekday = DateUtil.dayOfWeek(calendar.getTime());
//是否节假日
if (holiday.get(newDate).contains(time)) {
return "2";//法定节假日
} else if (extraWorkDay.get(newDate).contains(time)) {
return "0";//工作日
} else if (weekday == Calendar.SATURDAY || weekday == Calendar.SUNDAY) {
return "1";//周末
} else {
return "0";//工作日
}
}
最后调用这个工具类,只需判断是否为"0",不为"0"则是节假日(周末和法定节假日)。
如果考虑到接口调用速度,可以采用定时任务进行入库,或者项目启动时调用等方式,避免接口超时问题。