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;
}
}
}