判断当前时间是否是法定节假日或工作日
- 一、介绍
- 二、实现
一、介绍
- 采用语言: Java
- 基于内网下采取配置文件的方式, 来判断当前是否是节假日(包括周末和调休上班日)
- 如果基于外网取请见 这里
- 工具类实现思路: 将国家法定节假日和调休上班日的日期写入文本中, 然后读取该文本, 将加班日和节假日分别放入一个list中 然后将当前毫秒数转成当前日期(年月日), 然后依次判断是否是法定节假日, 调休加班日和周末
- 计算逻辑: 法定工作日= 调休加班日 非法定节假日 平时工作日(周1~5) 法定休息日= 非法定工作日 法定节假日= 不在法定节假日list中
二、实现
采取文件进行配置的初衷是: 解耦. 与其将节假日等相关日期的写入放入代码中, 不如将日期相关配置独立出来, 方便配置的同时对代码进行解耦
resources 目录下(与application.properties配置文件同级)新建一个文件 holiday.txt
存放当年的法定节假日和调休加班日等日期, 例如今年的配置
代码语言:javascript复制#######法定节假日日期#######
2022-01-01
2022-01-02
2022-01-03
2022-01-31
2022-02-01
2022-02-02
2022-02-03
2022-02-04
2022-02-05
2022-02-06
2022-04-03
2022-04-04
2022-04-05
2022-04-30
2022-05-01
2022-05-02
2022-05-03
2022-05-04
2022-06-03
2022-06-04
2022-06-05
2022-09-10
2022-09-11
2022-09-12
2022-10-01
2022-10-02
2022-10-03
2022-10-04
2022-10-05
2022-10-06
2022-10-07
2023-01-01
2023-01-02
#######调休加班日期#######
2022-01-29
2022-01-30
2022-04-02
2022-04-24
2022-05-07
2022-10-08
2022-10-09
- 每年大概10月份左右会出现第二年的法定节假日公告 点击 这里 查看当年法定节假日安排
- 工具类代码
import org.apache.commons.io.FileUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
* info: 调用API接口判断日期是否是工作日 周末还是节假日
*
* @Author caoHaiYang
* {@Location 配置文件位于: /resources/holiday.txt}
*/
public class HolidayUtils {
/**
* 法定节假日
*/
static List<String> holiday = new ArrayList<>();
/**
* 调休上班日
*/
static List<String> extraWorkDay = new ArrayList<>();
/**
* 法定节假日标识字符串
*/
private static final String HOLIDAY_FLAG_STRING = "#######法定节假日日期#######";
/**
* 调休加班标识字符串
*/
private static final String EXTRAWORKDAY_FLAG_STRING = "#######调休加班日期#######";
/**
* 初始化节假日和调休
*/
public static void initHolidayAndExtraWorkDay() throws IOException {
//方式二 利用FileUtils将ClassPathResource.getInputStream 得到的输入流复制到临时文件中
Resource resource = new ClassPathResource("holiday.txt");
InputStream inputStream = resource.getInputStream();
File tempFile = File.createTempFile("temp", ".txt");
FileUtils.copyInputStreamToFile(inputStream, tempFile);
String s = FileUtils.readFileToString(tempFile, StandardCharsets.UTF_8);
String[] split = s.split("rn");
//方式一, 手动编写文件读取方法
//List<String> list = readTxtFile("holiday.txt");
List<String> list = Arrays.asList(split);
//定义起始下标
int startIndex = 0;
//定义结束下标
int endIndex = 0;
startIndex = list.indexOf(HOLIDAY_FLAG_STRING);
endIndex = list.indexOf(EXTRAWORKDAY_FLAG_STRING);
List<String> holidayList = list.subList(startIndex 1, endIndex);
List<String> initExtraWorkDay = list.subList(endIndex 1, list.size());
//初始化节假日
holiday.addAll(holidayList);
//初始化额外加班日
extraWorkDay.addAll(initExtraWorkDay);
}
/**
* 判断是否是工作日
* 法定工作日: 调休加班日 非法定节假日 平时工作日(周1~5)
*
* @param time 当前时间(毫秒数)
* @return true: 工作日, false: 节假日
* @throws IOException
*/
public static Boolean isWorkingDay(long time) throws IOException {
LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneOffset.of(" 8"));
String formatTime = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
initHolidayAndExtraWorkDay();
//是否加班日
if (extraWorkDay.contains(formatTime)) {
return true;
}
//是否节假日
if (holiday.contains(formatTime)) {
return false;
}
//如果是1-5表示周一到周五 是工作日
DayOfWeek week = dateTime.getDayOfWeek();
if (week == DayOfWeek.SATURDAY || week == DayOfWeek.SUNDAY) {
return false;
}
return true;
}
/**
* 判断是否是法定休息日
* 法定休息日:非法定工作日
*
* @param time 当前时间(毫秒数)
* @return true: 休息日, false: 工作日
* @throws IOException
*/
public static Boolean isOffDay(long time) throws IOException {
return !isWorkingDay(time);
}
/**
* 判断是否是法定节假日
*
* @param time 当前时间(毫秒数)
* @return true: 节假日, false: 非节假日
* @throws IOException
*/
public static Boolean isHoliday(long time) throws IOException {
LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneOffset.of(" 8"));
String formatTime = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
initHolidayAndExtraWorkDay();
//是否节假日
if (holiday.contains(formatTime)) {
return false;
}
return true;
}
/**
* Java读取txt文件的内容
*
* @param fileName resources目录下文件名称
* @return 转为String
*/
public static List<String> readTxtFile(String fileName) {
List<String> listContent = new ArrayList<>();
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
String encoding = "utf-8";
try {
Resource resource = new ClassPathResource(fileName);
is = resource.getInputStream();
isr = new InputStreamReader(is, encoding);
br = new BufferedReader(isr);
String lineTxt = null;
while ((lineTxt = br.readLine()) != null) {
listContent.add(lineTxt);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
isr.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return listContent;
}
//测试工具类方法
public static void main(String[] args) throws IOException, ParseException {
//当前时间
long currentTimeStamp = LocalDateTime.now().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
Boolean workingDay = isWorkingDay(currentTimeStamp);
if (workingDay) {
System.out.println("工作日,加油,打工人");
} else {
System.out.println("休息日, 放假了, 兄弟萌");
}
}
}
ps: 如果使用当前方式进行配置后, 如果在打包后运行的jar 仍提示 File 'holiday.txt' does not exist
, 可以参照 这里 解决