SpringBoot节假日(OneAPI和天聚数行)
SpringBoot节假日(OneAPI和天聚数行)
一、场景
后台开发中,有些需要使用节假日的场景,例如:
1、下单时,选择工作日
2、查询某一天,是否为节假日
二、方法(已使用)
本文简单介绍两种方法,如下:
1、OneAPI–节假日
2、天聚数行–节假日
三、OneAPI
1、文档
API地址:https://oneapi.coderbox.cn/openapi/public/holiday
文档地址:https://oneapi.coderbox.cn/doc/949712861251586
2、API简介
可按年、月查询自2011年以来的节假日以及放假补班情况。
法定节假日参考:《国务院关于修改《全国年节及纪念日放假办法》的决定》
3、API信息
接口地址:https://oneapi.coderbox.cn/openapi/public/holiday
请求方式:GET
调用类型:同步
认证方式:无需认证
频率限制:不限制
计费方式:免费
4、请求参数
参数名 | 类型 | 必须 | 含义 | 说明 |
---|---|---|---|---|
date | string | 否 | 要查询的日期 | 可按年或月查询,支持前缀模糊匹配。如查询2023年则填写2023,查询2023年5月则填写2023-05 |
queryType | number | 否 | 查询类型 | 1仅节日,只返回节日和补班的日期;2日历,返回每一天的。默认为1 |
5、响应参数
参数名 | 类型 | 必须 | 含义 | 说明 |
---|---|---|---|---|
date | string | 是 | 日期 | 格式为”2023-05-01“ |
lunarDate | string | 是 | 农历日期 | 格式为”2023-05-01“ |
weekDay | number | 是 | 周内天数(1-7) | 周一为1,周日为7 |
status | number | 是 | 状态:1上班 ,2放假 | 上班:含正常工作日及补班;放假:含周末及节假日 |
festival | string | 否 | 节日 | 国家法定节日:元旦节, 春节, 清明节, 劳动节, 端午节, 中秋节, 国庆节 |
badDay | number | 否 | 是否补班:1补班 | 需要补班,真是难受的一天!仅当需要补班时有该字段 |
description | string | 否 | 描述 | 表示什么时候补班,例如劳动节前补班、国庆节后补班等。仅需要补班时有该字段 |
statutory | number | 否 | 是否法定节假日:1是 | 如果是法定节假日则返回1,仅当是法定节假日时有该字段 |
6、响应示例
{
"code": 0,
"data": [
{
"date": "2024-05-01",
"lunarDate": "2024-03-23",
"weekDay": 3,
"status": 2,
"festival": "劳动节",
"statutory": 1
},
{
"date": "2024-05-11",
"lunarDate": "2024-04-04",
"weekDay": 6,
"status": 1,
"badDay": 1,
"description": "劳动节后补班"
}
],
"msg": ""
}
7、java简单示例代码
(1)请求类(测试)
/**
* @descri 返回工作日列表
* orderTime 下单时间
* workNum 返回几天工作日
**/
public AjaxResult workDay(@RequestParam String orderTime,@RequestParam int workNum) throws IOException, ParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
//获取当前日期和时间
Date currentDate = dateFormat.parse(applyTime);
Calendar calendar = Calendar.getInstance();
calendar.setTime(currentDate);
int currentYear = calendar.get(Calendar.YEAR);
String url = String.format("https://oneapi.coderbox.cn/openapi/public/holiday?date=%s&queryType=%s", currentYear, "2");
List<WeekDayDataVo> workDayList = httpClientUtil.workDay(url, orderTime, workNum);
//如果天数不足,查询下一年
if(workDayList.size() < num){
//设置为下一年的第一天
calendar.set(Calendar.YEAR, currentYear + 1);
calendar.set(Calendar.MONTH, Calendar.JANUARY);
calendar.set(Calendar.DAY_OF_MONTH, 1);
Date nextYearFirstDay = calendar.getTime();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String nextUrl = String.format("https://oneapi.coderbox.cn/openapi/public/holiday?date=%s&queryType=%s", currentYear+1, "2");
List<WeekDayDataVo> workDayNextList = httpClientUtil.workDay(nextUrl, format.format(nextYearFirstDay), num-workDayList.size());
for (WeekDayDataVo weekDayDataVo : workDayNextList) {
workDayList.add(weekDayDataVo);
}
}
return AjaxResult.success(workDayList);
}
(2)工具类
public class HttpClientUtil {
// 创建OkHttpClient实例
private static final OkHttpClient client = new OkHttpClient();
//工作日列表
public List<WeekDayDataVo> workDay(String url, String applyTime,int num) throws IOException {
// 构建请求
Request request = new Request.Builder()
.url(url)
.build();
// 执行请求并获取响应
try (Response response = client.newCall(request).execute()) {
// 如果请求成功返回响应体,否则抛出异常
if (!response.isSuccessful()){
throw new IOException("Unexpected code " + response);
}
List<WeekDayDataVo> arrayList = new ArrayList<>();
WeekDayVo weekDayVo = JSON.parseObject(response.body().string(), WeekDayVo.class);
WeekDayDataVo[] data = weekDayVo.getData();
OptionalInt index = IntStream.range(0, data.length)
.filter(i -> applyTime.equals(data[i].getDate()))
.findFirst();
WeekDayDataVo[] dayData = Arrays.stream(data)
.filter(weekDayDataVo -> weekDayDataVo.getDate().equals(applyTime))
.toArray(WeekDayDataVo[]::new);
//判断当前是否为工作日
if(Constants.WORK_DAY_STATUS_1 == dayData[0].getStatus()){
int lastIndex = index.isPresent() ? index.getAsInt() + num : num;
if(lastIndex == num){
for (WeekDayDataVo datum : data) {
arrayList.add(datum);
}
}else{
//添加对应数量工作日
for (int i = index.getAsInt(); i < data.length ; i++) {
if(data[i].getStatus() == Constants.WORK_DAY_STATUS_1 && num > 0){
arrayList.add(data[i]);
num --;
}
}
}
}else{
int lastIndexData = 0;
for (int i = index.getAsInt(); i < data.length; i++) {
if(data[i].getStatus() == Constants.WORK_DAY_STATUS_1){
lastIndexData = i;
break;
}
}
//添加对应数量工作日
for (int i = lastIndexData; i < data.length ; i++) {
if(data[i].getStatus() == Constants.WORK_DAY_STATUS_1 && num > 0){
arrayList.add(data[i]);
num --;
}
}
}
return arrayList;
}
}
}
四、天聚数行
1、介绍
1.1、查询节假日信息,接口返回节日名称类型、农历信息、上班调休、工资倍数、假期范围、拼假建议、及工作日相关信息等。通过请求参数mode还可以指定是否返回当天有关的国内外节日信息
1.2、接口支持按年、按月、按日期范围和多个日期批量查询。如按年查询(type=1&date=2020)、按月查询(type=2&date=2020-10)、按日期范围查询(type=3&date=2020-11-1~2020-11-10)、按多个日期批量查询(date=2020-10-1,2020-11-12)
1.3、请注意,按年查询只返回中国官方节假日信息;按月查询如只传年月,则为从该月第一天到最后一天;按范围查询,起点和终点用波浪号~分隔;按多个日期批量查询用英文半角逗号分隔。无论哪种查询方式,单次查询所包含的总日期数不能超过31天。
1.4、daycode表示日期类型,0表示工作日、1节假日、2双休日、3调休日(需上班)。判断是否需要上班建议用isnotwork字段,其中值为0表示上班,为1表示休息。wage表示薪资倍数,周末为两倍,法定节假日当天为三倍其他两倍(按年查询时返回三倍薪资的具体日期)。
2、接口信息
判断日期是否为官方节假日支持按年、按月和范围批量查询
接口地址:https://apis.tianapi.com/jiejiari/index
请求示例:https://apis.tianapi.com/jiejiari/index?key=你的APIKEY&date=2021-01-01&type=0
支持协议:http/https
请求方式:get/post
返回格式:utf-8 json
3、请求参数
3.1、post方式请求时,enctype应为application/x-www-form-urlencoded
3.2、上传文件二进制数据流方式,enctype必须为multipart/form-data/
3.3、参数url、base64中有特殊字符时,建议对值urlencode编码后传递
名称 | 类型 | 必须 | 示例值/默认值 | 说明 |
---|---|---|---|---|
key | string | 是 | 您自己的APIKEY 注册账号后获得 | API密钥 |
date | string | 是 | 2021-01-01 | 查询日期或日期范围 |
type | int | 是 | 0 | 查询类型,0批量、1按年、2按月、3范围 |
mode | int | 否 | 0 | 查询模式,为1同时返回中外特殊节日信息 |
4、返回示例
//成功,code=>200并产生计费
{
"code": 200,
"msg": "success",
"result": {
"list": [
{
"date": "2021-01-01",
"daycode": 1,
"weekday": 5,
"cnweekday": "星期五",
"lunaryear": "庚子",
"lunarmonth": "冬月",
"lunarday": "十八",
"info": "节假日",
"start": 0,
"now": 0,
"end": 2,
"holiday": "1月1号",
"name": "元旦节",
"enname": "NewYear'sDay",
"isnotwork": 1,
"vacation": [
"2021-01-01",
"2021-01-02",
"2021-01-03"
],
"remark": [
"2021-12-26",
"2021-01-08"
],
"wage": 3,
"tip": "1月1日放假,共3天。",
"rest": "2020年12月28日至2020年12月31日请假四天,与周末连休可拼七天长假。"
}
]
}
}
//失败
{
"code": 150,
"msg": "API可用次数不足"
}
5、返回状态码
后续如果在使用,会继续更新
一个在学习中的开发者,勿喷,欢迎交流