由于开发的系统需要根据工作日和节假日来进行逻辑判断,所以这里研究了下方案:
1. 自己维护一份日历表,把每天的日期类型标注清楚
之前的一家公司就是这样解决的,需要每年去手动更新。如果公司规模比较大,对数据稳定性要求较高,建议选择这种方式。切记不要为了偷懒而因小失大!
2. 在线API实时获取
嘿嘿,我现在就是选择这种方式。项目比较小型,接口访问量少,能容忍稍微的接口超时。那么毫无疑问就可以选择API获取了!话不多说,上代码:
/**
* 判断是否为工作日
* @param date
* @return
*/
public static boolean isWorkday(Date date){
try{
String url = "http://timor.tech/api/holiday/info/" + parseString(date,FMT_YYYY_MM_DD);
String result = HttpClientUtils.httpGetRequest(url);
JSONObject obj = JSONObject.parseObject(result);
Integer code = obj.getInteger("code");
if (null != code && 0 == code.intValue()){
Integer dayType = obj.getJSONObject("type").getInteger("type");
return 0 == dayType.intValue();
}
}catch (Exception e){
LOGGER.error("网络异常:{}",e);
}
return true;
}
请求示例:http://timor.tech/api/holiday/info/2021-6-18
接口返回:{"code":0,"type":{"type":0,"name":"周五","week":5},"holiday":null}
下面是引用源网上的使用教程:
{
"code": 0, // 0服务正常。-1服务出错
"type": {
"type": enum(0, 1, 2, 3), // 节假日类型,分别表示 工作日、周末、节日、调休。
"name": "周六", // 节假日类型中文名,可能值为 周一 至 周日、假期的名字、某某调休。
"week": enum(1 - 7) // 一周中的第几天。值为 1 - 7,分别表示 周一 至 周日。
},
"holiday": { //工作日时为null
"holiday": false, // true表示是节假日,false表示是调休
"name": "国庆前调休", // 节假日的中文名。如果是调休,则是调休的中文名,例如'国庆前调休'
"wage": 1, // 薪资倍数,1表示是1倍工资
"after": false, // 只在调休下有该字段。true表示放完假后调休,false表示先调休再放假
"target": '国庆节' // 只在调休下有该字段。表示调休的节假日
}
}
当然这是私人服务器,免费开放给咱们使用的,每人1天可调用1万次,真的是良心制作了!谢谢老哥!这里贴上他的网站地址:http://timor.tech/api/holiday/,大家有兴趣可以去捧捧场。