• Spring Boot获取节假日API


    项目场景:

    需要知道某一天是不是节假日,或者是休息日。


    问题描述

    我们知道每年的假节日要等国家规定好,我们才能知道,所以自己是算不出的。

    马上想到的两个解决方法:

    1.通过调用互联网的节假日API(优点:方便,缺点:主动权在别人手里,万一别人的服务器出了问题,自己的服务也会受影响)

    2.每年自己手动配置一次(优点:安全不会出问题,缺点:麻烦)

    感觉都不是很完美,最后把这两种结合一下,生成的解决方案:

    每年年底定时去调用互联网的节假日API,做个异常捕捉,如果同步失败,证明这个接口可能出了问题,然后再去手动配置。后面再去排查接口的问题,如果是接口已经停用了,那么再换另一个节假日API的接口,重新调整。所以最好选个比较稳定的第三方接口。

    我这边用的是RollToolsApi官网:https://www.mxnzp.com/


    解决方案:

    节假日接口:https://www.mxnzp.com/doc/detail?id=1

    关键代码:我这里只是打印了日期,没有入库,大家可以入库保存,其中app_id和app_secret需要在官网创建,是免费的。

    1. package com.test.controller;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.util.CollectionUtils;
    4. import org.springframework.web.bind.annotation.RequestBody;
    5. import org.springframework.web.bind.annotation.RequestMapping;
    6. import org.springframework.web.bind.annotation.RequestMethod;
    7. import org.springframework.web.bind.annotation.RestController;
    8. import org.springframework.web.client.RestTemplate;
    9. import com.test.dto.Holiday;
    10. import com.test.dto.HolidayData;
    11. import com.test.dto.HolidayResult;
    12. import io.swagger.annotations.Api;
    13. import io.swagger.annotations.ApiOperation;
    14. @RestController
    15. @RequestMapping("/day")
    16. @Api(value = "节假日")
    17. public class TestController {
    18. @Autowired
    19. private RestTemplate restTemplate;
    20. @RequestMapping(value = "getDay", method = RequestMethod.GET)
    21. @ApiOperation(value = "测试")
    22. public String getDay() {
    23. /*
    24. * 互联网节假日api接口,公安网需要主动导入配置
    25. * www.mxnzp.com
    26. * ignoreHoliday: 是否忽略节假日,仅仅获取万年历,默认值false
    27. */
    28. String url = "https://www.mxnzp.com/api/holiday/list/year/2022"
    29. + "?ignoreHoliday=false&app_id=登录官网创建&app_secret=登录官网创建";
    30. HolidayResult result = restTemplate.getForObject(url, HolidayResult.class);
    31. if(result.getCode() != null && result.getCode() == 1){
    32. //成功: code: 状态码 1.返回成功 0.返回失败
    33. if(!CollectionUtils.isEmpty(result.getData())){
    34. for (HolidayData data : result.getData()) {
    35. System.out.println("月份: "+data.getMonth());
    36. for (Holiday day : data.getDays()) {
    37. System.out.println(day.getDate()+"\t"+day.getType()+"\t"+day.getTypeDes());
    38. }
    39. System.out.println("\n");
    40. }
    41. }
    42. }else{
    43. //失败
    44. }
    45. return result.getMsg();
    46. }
    47. @RequestMapping(value = "importDay", method = RequestMethod.POST)
    48. @ApiOperation(value = "测试导入")
    49. public String importDay(@RequestBody HolidayResult result) {
    50. if(result == null){
    51. return "不能为空";
    52. }
    53. if(result.getCode() != null && result.getCode() == 1){
    54. //成功: code: 状态码 1.返回成功 0.返回失败
    55. if(!CollectionUtils.isEmpty(result.getData())){
    56. for (HolidayData data : result.getData()) {
    57. System.out.println("月份: "+data.getMonth());
    58. for (Holiday day : data.getDays()) {
    59. System.out.println(day.getDate()+"\t"+day.getType()+"\t"+day.getTypeDes());
    60. }
    61. System.out.println("\n");
    62. }
    63. }
    64. }else{
    65. //失败
    66. }
    67. return result.getMsg();
    68. }
    69. }

    实体类用于接收响应结果

    HolidayResult

    1. package com.test.dto;
    2. import java.util.List;
    3. import lombok.Data;
    4. @Data
    5. public class HolidayResult {
    6. private Integer code; //状态码 1.返回成功 0.返回失败
    7. private String msg; //提示信息
    8. private List data;
    9. }

    HolidayData

    1. package com.test.dto;
    2. import java.util.List;
    3. import lombok.Data;
    4. @Data
    5. public class HolidayData {
    6. private Integer month; //当前月份
    7. private Integer year; //当前年份
    8. private List days;
    9. }

    Holiday

    1. package com.test.dto;
    2. import lombok.Data;
    3. @Data
    4. public class Holiday {
    5. private String date; //当前日期
    6. private Integer weekDay; //当前周第几天 1-周一 2-周二 ... 7-周日
    7. private String yearTips; //天干地支纪年法描述 例如:戊戌
    8. private Integer type; //类型 0 工作日 1 休息日 2 节假日 如果ignoreHoliday参数为true,这个字段不返回
    9. private String typeDes; //类型描述 比如 国庆,休息日,工作日 如果ignoreHoliday参数为true,这个字段不返回
    10. private String chineseZodiac; //属相 例如:狗
    11. private String solarTerms; //节气描述 例如:小雪
    12. private String avoid; //不宜事项
    13. private String lunarCalendar; //农历日期
    14. private String suit; //宜事项
    15. private Integer dayOfYear; //这一年的第几天
    16. private Integer weekOfYear; //这一年的第几周
    17. private String constellation; //星座
    18. private Integer indexWorkDayOfMonth; //如果当前是工作日 则返回是当前月的第几个工作日,否则返回0 如果ignoreHoliday参数为true,这个字段不返回
    19. }

    我这里手动配置是采用json参数的方式,大家可以改为导入文件的方式。

    源码:https://download.csdn.net/download/u011974797/86513910

  • 相关阅读:
    1665. 完成所有任务的最少初始能量-快速排序+贪心算法
    灰度级形态学 - 灰度膨胀和灰度腐蚀
    【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 概述
    易周金融 | Q1手机银行活跃用户规模6.5亿;理财子公司布局新兴领域
    就在刚刚这份java八股文成功让我进入字节,拿到了人生第一个18k
    SpringBoot对接微信小程序支付功能开发(一,下单功能)
    Mybatis的介绍及使用
    GitHub 报告发布:TypeScript 取代 Java 成为第三受欢迎语言
    普通用户能执行docker命令
    Qt之分类导航主界面
  • 原文地址:https://blog.csdn.net/u011974797/article/details/126787453