java判断日期是否是节假日-周末-调休日(喂嘴里的注释量)

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<String,List<String>> holiday =new HashMap<>();       //假期
    static Map<String,List<String>> 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<String, Object> 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;
    }
}

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个 Java 实例,可以用来判断日期是否节假日、双休调休: ```java import java.time.DayOfWeek; import java.time.LocalDate; public class HolidayChecker { // 节假日日期列表,这里只列出了部分节假日日期,可以根据实际情况进行补充 private static final String[] HOLIDAYS = { "2022-01-01", // 元旦 "2022-02-01", // 春节 "2022-02-02", "2022-02-03", "2022-04-05", // 清明节 "2022-05-01", // 劳动节 "2022-06-01", // 儿童节 "2022-09-21", // 中秋节 "2022-10-01", // 国庆节 "2022-10-02", "2022-10-03", "2022-10-04", "2022-10-05", "2022-10-06", "2022-10-07" }; /** * 判断指定日期是否节假日 * * @param date 日期,格式为"yyyy-MM-dd" * @return 是否节假日 */ public static boolean isHoliday(String date) { for (String holiday : HOLIDAYS) { if (date.equals(holiday)) { return true; } } return false; } /** * 判断指定日期是否为双休 * * @param date 日期,格式为"yyyy-MM-dd" * @return 是否为双休 */ public static boolean isWeekend(String date) { LocalDate localDate = LocalDate.parse(date); DayOfWeek dayOfWeek = localDate.getDayOfWeek(); return dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY; } /** * 判断指定日期是否调休 * * @param date 日期,格式为"yyyy-MM-dd" * @return 是否调休 */ public static boolean isAdjustRestDay(String date) { LocalDate localDate = LocalDate.parse(date); DayOfWeek dayOfWeek = localDate.getDayOfWeek(); // 判断是否为周一到周五的工作,如果是则需要判断是否调休 if (dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY) { // 调休节假日前后的工作,需要判断前一天和后一天是否节假日 LocalDate prevDate = localDate.minusDays(1); LocalDate nextDate = localDate.plusDays(1); return isHoliday(prevDate.toString()) || isHoliday(nextDate.toString()); } return false; } public static void main(String[] args) { String date = "2022-01-01"; System.out.println(date + "是否节假日:" + isHoliday(date)); System.out.println(date + "是否为双休:" + isWeekend(date)); System.out.println(date + "是否调休:" + isAdjustRestDay(date)); } } ``` 在这个例子中,我们使用了 Java 8 中的 LocalDate 类来处理日期,并使用 DayOfWeek 类来获取星期几。在 isHoliday() 方法中,我们使用一个字符串数组来存储节假日日期列表,并通过循环来判断指定日期是否节假日。在 isWeekend() 方法中,我们使用 DayOfWeek 类来判断指定日期是否为周六或周。在 isAdjustRestDay() 方法中,我们判断指定日期是否为周一到周五的工作,如果是,则判断前一天和后一天是否节假日来确定是否调休。最后,在 main() 方法中,我们演示了如何使用这些方法来判断指定日期是否节假日、双休调休

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值