1、免费的api网站 : https://timor.tech/api/holiday/year
返回的结果是json格式数据,并且网址后面可以拼接年份:https://timor.tech/api/holiday/year/2024
没有使用则会返回当前年份。
根据日期判断周末,节假日,调休的工具类。
创建工具类直接调用方法使用
package com.zzkj.zzpm.common.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * * 判断是否是节假日,工具类 * * 返回值 : 0 上班 1周末 2节假日 * * @Author wzk * @Date 2024/2/23 16:05 */ @Slf4j public class HolidayUtil { static Map> holiday =new HashMap<>(); //假期 static Map > extraWorkDay =new HashMap<>(); //调休日 //判断是否为节假日 /** * * @param time 日期参数 格式‘yyyy-MM-dd’,不传参则默认当前日期 * @return */ public static String isWorkingDay(String time) throws ParseException { Date parse = null; //为空则返回当前时间 if (StringUtils.isNotBlank(time)){ SimpleDateFormat getYearFormat = new SimpleDateFormat("yyyy-MM-dd"); parse = getYearFormat.parse(time); }else { parse = new Date(); } String newDate = new SimpleDateFormat("yyyy").format(parse); //判断key是否有参数年份 if(!holiday.containsKey(newDate)){ String holiday = getYearHoliday(newDate); if ("No!".equals(holiday)){ return "该年份未分配日期安排!"; } } //得到日期是星期几 Date date = formatStringToDate(time, false); // Calendar.getInstance()获取一个Calendar实例 Calendar calendar = Calendar.getInstance(); // 设置日期 calendar.setTime(date); // 获取星期 int weekday = getDayOfWeek(calendar); // 是否是节假日 if(holiday.get(newDate).contains(time)){ return "2"; }else if(extraWorkDay.get(newDate).contains(time)){ //是否为调休 return "0"; }else if(weekday == Calendar.SATURDAY || weekday == Calendar.FRIDAY){ //是否为周末 return "1"; }else{ return "0"; } } /** * * @param date 日期参数 格式‘yyyy’,不传参则默认当前日期 * @return */ public static String getYearHoliday(String date) throws ParseException { //获取免费api地址 String httpUrl="https://timor.tech/api/holiday/year/"+date; BufferedReader reader = null; String result = null; // 用于存储返回的年份节假日数据 StringBuffer sbf = new StringBuffer(); try { // 创建url对象 URL url = new URL(httpUrl); // 使用openConnection方法创建了一个URLConnection对象 URLConnection connection = url.openConnection(); // 设置请求头 connection.setRequestProperty("User-Agent", "Mozilla/4.76"); connection.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); /** * 使用getInputStream方法获取输入流,这个输入流可以用来读取从URL地址返回的数据, * 可能是HTML内容、JSON数据或其他类型的信息。 * 具体取决于URL地址所指向的资源类型。 */ InputStream is = connection.getInputStream(); // BufferedReader创建字节流对象,InputStreamReader将字节流转换为字符流,编码为utf8 reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); String strRead = null; while ((strRead = reader.readLine()) != null) { sbf.append(strRead); // 将每行内容追加到sbf字符串变量中 sbf.append("\r\n"); // 手动添加换行符 } reader.close(); // 关闭流 //字符串转json JSONObject json = JSON.parseObject(sbf.toString()); //根据holiday字段获取jsonObject内容 JSONObject holiday = json.getJSONObject("holiday"); if (holiday.size() == 0){ return "No!"; } List hoList = new ArrayList<>(); List extraList = new ArrayList<>(); for (Map.Entry entry : holiday.entrySet()) { // 读取字符的值,并转换成字符串 String value = entry.getValue().toString(); // 将字符串改为json格式 JSONObject jsonObject = JSONObject.parseObject(value); // 获取是否为假日(是为true,不是为false) String hoBool = jsonObject.getString("holiday"); // 获取时间 String extra = jsonObject.getString("date"); //判断不是假期后调休的班 if(hoBool.equals("true")){ hoList.add(extra); // 添加假期 HolidayUtil.holiday.put(date,hoList); }else { extraList.add(extra); // 添加调休日 HolidayUtil.extraWorkDay.put(date,extraList); } } } catch (Exception e) { e.printStackTrace(); } return result; } /** * 功能:获取String日期对应的时间 * isTotal = false ;yyyy-MM-dd格式限定 * isTotal = true ;yyyy-MM-dd hh-mm-ss格式限定 */ public static Date formatStringToDate(String base, Boolean isTotal) { // 是否包含时间部分 String format = isTotal ? "yyyy-MM-dd HH-mm-ss" : "yyyy-MM-dd"; // 格式化字符串 DateFormat df = new SimpleDateFormat(format); Date baseTime; try { // 设定日期 baseTime = df.parse(base); } catch (Exception e) { return null; } return baseTime; } /** * 获得本日星期数,星期一:1,星期日:7 如果传入null则默认为本日 * * @return */ public static int getDayOfWeek(Calendar calendar) { int today; if (calendar != null) { today = calendar.get(Calendar.DAY_OF_WEEK); } else { today = Calendar.getInstance().get(Calendar.DAY_OF_WEEK); } if (today == 1) return 7; else return today - 1; } }