当前位置: 首页 > article >正文

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、请求参数

参数名类型必须含义说明
datestring要查询的日期可按年或月查询,支持前缀模糊匹配。如查询2023年则填写2023,查询2023年5月则填写2023-05
queryTypenumber查询类型1仅节日,只返回节日和补班的日期;2日历,返回每一天的。默认为1

5、响应参数

参数名类型必须含义说明
datestring日期格式为”2023-05-01“
lunarDatestring农历日期格式为”2023-05-01“
weekDaynumber周内天数(1-7)周一为1,周日为7
statusnumber状态:1上班 ,2放假上班:含正常工作日及补班;放假:含周末及节假日
festivalstring节日国家法定节日:元旦节, 春节, 清明节, 劳动节, 端午节, 中秋节, 国庆节
badDaynumber是否补班:1补班需要补班,真是难受的一天!仅当需要补班时有该字段
descriptionstring描述表示什么时候补班,例如劳动节前补班、国庆节后补班等。仅需要补班时有该字段
statutorynumber是否法定节假日: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编码后传递

名称类型必须示例值/默认值说明
keystring您自己的APIKEY 注册账号后获得API密钥
datestring2021-01-01查询日期或日期范围
typeint0查询类型,0批量、1按年、2按月、3范围
modeint0查询模式,为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、返回状态码
在这里插入图片描述

后续如果在使用,会继续更新

一个在学习中的开发者,勿喷,欢迎交流


http://www.kler.cn/a/511580.html

相关文章:

  • CamemBERT:一款出色的法语语言模型
  • 事务处理系统 (Transaction Processing System, TPS)
  • SQL Server查询计划操作符——查询计划相关操作符(4)
  • 什么是长连接?Netty如何设置进行长连接?
  • web worker 前端多线程一、
  • 改进果蝇优化算法之一:自适应缩小步长的果蝇优化算法(ASFOA)
  • 【系统分享01】Python+Vue电影推荐系统
  • ASP.NET Core 中基于 Cookie 的身份鉴权实现
  • 什么是HTTP POST请求?初学者指南与示范
  • HackMyVM-Klim靶机的测试报告
  • 复杂查询优化:避免 SQL 查询中的 N+1 查询问题
  • HTML-BFC+SEO+标签应用实例
  • 3.3 OpenAI GPT-4, GPT-3.5, GPT-3 模型调用:开发者指南
  • 探秘 JMeter 前置处理器:让性能测试如虎添翼
  • 【深入解析】棋类游戏算法:Minimax, Negamax, 蒙特卡洛树搜索与AlphaZero
  • 基于单片机的多功能门铃控制系统设计(论文+源码)
  • 自动化测试随笔一
  • 运行fastGPT 第五步 配置FastGPT和上传知识库 打造AI客服
  • 华为AI培训-NLP实验
  • C# 解析 HTML 实战指南
  • Perl语言的数据库编程
  • Git基础指南
  • C++性能优化指南:探索无锁队列设计与实现
  • Docker配置国内镜像源
  • MySQL - 主从同步
  • 4.6.2排序(三)冒泡排序与简单选择排序算法