欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java 获取日期是否是工作日(包括正常工作日和节假日调休补班)

程序员文章站 2022-03-03 10:03:47
...

本博客提供两个方法,集成一个工具类 

1.传入 yyyyMMdd 格式的 String 类型时间 返回今天是否是工作日,请求http://api.goseek.cn/ 网站 获取 getIsWorkingDay()

2.传入 Integer 类型 的 工作日 天数,返回从今天开始往前推的自然日天数。getNatureDay()

package com.xxx.quartz.utils;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Slf4j
public class GetIsWorkingDay {

    /**
     * 正常工作日对应结果为 0
     */
    public static final String DAY_STATUS_0 = "0";
    /**
     * 法定节假日对应结果为 1
     */
    public static final String DAY_STATUS_1 = "1";
    /**
     * 节假日调休补班对应的结果为 2
     */
    public static final String DAY_STATUS_2 = "2";
    /**
     * 休息日对应结果为 3
     */
    public static final String DAY_STATUS_3 = "3";

    /**
     * 传入格式 为 yyyyMMdd 日期 返回 是否是工作日
     */
    public static Boolean getIsWorkingDay(String date) {
        try {
            URL u = new URL("http://api.goseek.cn/Tools/holiday?date=" + date);
            InputStream in = u.openStream();
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            try {
                byte buf[] = new byte[1024];
                int read = 0;
                while ((read = in.read(buf)) > 0) {
                    out.write(buf, 0, read);
                }
            } finally {
                if (in != null) {
                    in.close();
                }
            }
            byte b[] = out.toByteArray();
            String s = new String(b, "utf-8");
            JSONObject jsonObject = JSONObject.parseObject(s);
            if (DAY_STATUS_0.equals(jsonObject.getString("data")) || DAY_STATUS_2.equals(jsonObject.getString("data"))) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("------------------调用获取工作日接口失败------------------");
            return true;
        }
    }
    /**
     * 传入要工作日天数,返回从今天开始往前推的自然日天数
     */
    public static Integer getNatureDay(Integer day) {
        try {
            Integer reDay =0;
            LocalDateTime ldt = LocalDateTime.now();
            LocalDate ld = ldt.toLocalDate();
            for(int i=0;i<day;i++) {
                ld = ld.minusDays(1);
                String date = ld.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
                Boolean flg = getIsWorkingDay(date);
                if(!flg){
                   day++;
                }
                reDay++;
                //为防止死循环 不计算大于100个自然日
                if(day>100){
                    break;
                }
            }
            return reDay;
        } catch (Exception e) {
            e.printStackTrace();
            log.error("------------------调用获取工作日接口失败------------------");
            return day;
        }
    }
}