教你怎么用Java获取国家法定节假日

作者:No8g攻城狮 时间:2021-05-24 01:16:04 

前言

此节假日为严格按照国家要求的双休和法定节假日并且包含节假日的补班信息,大家可根据自己的需求自定义处理哦。

以下为Maven配置,是程序用到的依赖。版本的话,可以用最新的。

Maven配置


<!-- okhttp -->
       <dependency>
           <groupId>com.squareup.okhttp</groupId>
           <artifactId>okhttp</artifactId>
           <version>${okhttp.version}</version>
       </dependency>

<!-- fastjson -->
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
           <version>${fastjson.version}</version>
       </dependency>

Java程序


package com.uiotsoft.daily.task;

import com.alibaba.fastjson.JSONObject;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
* <p>TestDate 此类用于:</p>
* <p>@author:hujm</p>
* <p>@date:2021年04月22日 17:43</p>
* <p>@remark:</p>
*/
public class TestDate {

public static void main(String[] args) {
       System.out.println(getJjr(2021, 4));
       System.out.println(getMonthWekDay(2021, 4));
       System.out.println(JJR(2021, 4));

}

/**
    * 获取周末和节假日
    *
    * @param year
    * @param month
    * @return
    */
   public static Set<String> JJR(int year, int month) {
       //获取所有的周末
       Set<String> monthWekDay = getMonthWekDay(year, month);
       //http://timor.tech/api/holiday api文档地址
       Map jjr = getJjr(year, month + 1);
       Integer code = (Integer) jjr.get("code");
       if (code != 0) {
           return monthWekDay;
       }
       Map<String, Map<String, Object>> holiday = (Map<String, Map<String, Object>>) jjr.get("holiday");
       Set<String> strings = holiday.keySet();
       for (String str : strings) {
           Map<String, Object> stringObjectMap = holiday.get(str);
           Integer wage = (Integer) stringObjectMap.get("wage");
           String date = (String) stringObjectMap.get("date");
           //筛选掉补班
           if (wage.equals(1)) {
               monthWekDay.remove(date);
           } else {
               monthWekDay.add(date);
           }
       }
       return monthWekDay;
   }

/**
    * 获取节假日不含周末
    *
    * @param year
    * @param month
    * @return
    */
   private static Map getJjr(int year, int month) {
       String url = "http://timor.tech/api/holiday/year/";
       OkHttpClient client = new OkHttpClient();
       Response response;
       //解密数据
       String rsa = null;
       Request request = new Request.Builder()
               .url(url)
               .get()
               .addHeader("Content-Type", "application/x-www-form-urlencoded")
               .build();
       try {
           response = client.newCall(request).execute();
           rsa = response.body().string();
       } catch (IOException e) {
           e.printStackTrace();
       }
       return JSONObject.parseObject(rsa, Map.class);
   }

/**
    * 获取周末  月从0开始
    *
    * @param year
    * @param mouth
    * @return
    */
   public static Set<String> getMonthWekDay(int year, int mouth) {
       Set<String> dateList = new HashSet<>();
       SimpleDateFormat simdf = new SimpleDateFormat("yyyy-MM-dd");
       Calendar calendar = new GregorianCalendar(year, mouth, 1);
       Calendar endCalendar = new GregorianCalendar(year, mouth, 1);
       endCalendar.add(Calendar.MONTH, 1);
       while (true) {
           int weekday = calendar.get(Calendar.DAY_OF_WEEK);
           if (weekday == 1 || weekday == 7) {
               dateList.add(simdf.format(calendar.getTime()));
           }
           calendar.add(Calendar.DATE, 1);
           if (calendar.getTimeInMillis() >= endCalendar.getTimeInMillis()) {
               break;
           }
       }
       return dateList;
   }

}

以上方法可以拿来即用,当然也可以根据自己的需求自定义。

以下是我自己业务需求,将调用API接口获取的节假日信息保存到本地数据库中,如果不感兴趣可以跳过以下内容哦~~~~


package com.uiotsoft.daily.task;

import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import com.uiotsoft.daily.module.entity.DailyHolidayConfig;
import com.uiotsoft.daily.module.entity.HolidayRawInfo;
import com.uiotsoft.daily.module.service.DailyHolidayConfigService;
import com.uiotsoft.daily.module.service.TaskService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;

/**
* <p>NoSubmitTask 此类用于:</p>
* <p>@author:hujm</p>
* <p>@date:2021年04月16日 17:10</p>
* <p>@remark:</p>
*/
@Slf4j
@Component
public class NoSubmitTask {

@Resource
   private DailyHolidayConfigService holidayConfigService;

@Value("${syncAddress}")
   private String syncAddress;

@Scheduled(cron = "${syncHolidayDeadline}")
   public void syncHoliday() {

log.info("每年12月28凌晨1点定时同步下一年的节假日信息,同步节假日开始时间 = {}", DateUtil.formatDateTime(new Date()));

String url = syncAddress;
       OkHttpClient client = new OkHttpClient();
       Response response;
       //解密数据
       String rsa = null;
       Request request = new Request.Builder().url(url).get()
               .addHeader("Content-Type", "application/x-www-form-urlencoded")
               .build();
       try {
           response = client.newCall(request).execute();
           rsa = response.body().string();
       } catch (IOException e) {
           e.printStackTrace();
       }

Map map = JSONObject.parseObject(rsa, Map.class);
       if (map != null) {
           Integer code = (Integer) map.get("code");
           if (code == 0) {
               JSONObject holidayJson = (JSONObject) map.get("holiday");
               String jsonString = holidayJson.toJSONString();
               log.info("获取节假日数据内容为 jsonString = 【{}】", jsonString);
               Set<Map.Entry<String, Object>> entrySet = holidayJson.entrySet();
               List<HolidayRawInfo> rawInfoList = new ArrayList<>();
               for (Map.Entry<String, Object> entry : entrySet) {
                   String key = entry.getKey();
                   Object value = entry.getValue();
                   cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(value);
                   HolidayRawInfo holidayRawInfo = JSONUtil.toBean(jsonObject, HolidayRawInfo.class);
                   rawInfoList.add(holidayRawInfo);
               }
               // 定义节假日集合
               List<DailyHolidayConfig> holidayConfigList = new ArrayList<>();
               for (HolidayRawInfo holidayRawInfo : rawInfoList) {
                   DailyHolidayConfig holidayConfig = new DailyHolidayConfig();
                   holidayConfig.setHolidayTarget(holidayRawInfo.getTarget());
                   holidayConfig.setHolidayAfter(holidayRawInfo.getAfter());
                   holidayConfig.setHolidayDate(holidayRawInfo.getDate());
                   holidayConfig.setHolidayName(holidayRawInfo.getName());
                   holidayConfig.setHolidayRest(holidayRawInfo.getRest());
                   holidayConfig.setHolidayWage(holidayRawInfo.getWage());
                   holidayConfig.setCreateTime(new Date());
                   holidayConfigList.add(holidayConfig);
               }

// 根据日期排序升序
               List<DailyHolidayConfig> collect = holidayConfigList.stream().sorted(Comparator.comparing(DailyHolidayConfig::getHolidayDate)).collect(Collectors.toList());

// 批量插入节假日表中
               holidayConfigService.insertBatch(collect);
           } else {
               log.error("E|NoSubmitTask|syncHoliday()|同步节假日信息时,调用节假日网站服务出错!");
           }
       }

log.info("每年12月28凌晨1点定时同步下一年的节假日信息,同步节假日结束时间 = {}", DateUtil.formatDateTime(new Date()));
   }
}

来源:https://blog.csdn.net/weixin_44299027/article/details/116028963

标签:java,国家法定节假日,时间
0
投稿

猜你喜欢

  • java抓取网页或文件中的邮箱号码

    2023-07-30 19:19:28
  • C#实现简单俄罗斯方块

    2023-06-18 07:18:36
  • 使用SpringBoot+EasyExcel+Vue实现excel表格的导入和导出详解

    2023-07-18 18:15:14
  • Java创建线程的七种方法总结(全网最全面)

    2023-11-03 14:27:26
  • 基于Spring Boot不同的环境使用不同的配置方法

    2022-11-06 13:21:20
  • SpringBoot2之PUT请求接收不了参数的解决方案

    2023-08-23 01:32:07
  • Java Stream流零基础教程

    2023-08-15 19:33:20
  • MyBatis在SQL语句中如何获取list的大小

    2021-08-15 12:09:55
  • Java使用备忘录模式实现过关类游戏功能详解

    2022-11-30 08:52:51
  • 详解java Collections.sort的两种用法

    2023-11-28 09:30:31
  • 如何设置Spring Boot测试时的日志级别

    2023-11-10 14:11:20
  • Spring MVC接口防数据篡改和重复提交

    2023-11-29 15:02:11
  • 一篇文章带你入门Java数据类型

    2022-06-10 09:25:44
  • Java内存模型JMM与volatile

    2022-03-25 09:33:50
  • RocketMQ源码解析broker 启动流程

    2022-12-25 10:50:54
  • Java二维数组查找功能代码实现

    2023-01-04 19:47:17
  • Java中TypeReference用法详情说明

    2023-11-24 19:05:05
  • 一文带你学会Spring JDBC的使用

    2023-11-29 17:05:34
  • mybatis 查询返回Map<String,Object>类型

    2023-11-14 07:06:09
  • 浅谈图片上传利用request.getInputStream()获取文件流时遇到的问题

    2023-10-18 10:36:43
  • asp之家 软件编程 m.aspxhome.com