判断当前时间是否是法定节假日或工作日

判断当前时间是否是法定节假日或工作日


一、介绍

  • 采用语言: Java
  • 基于内网下采取配置文件的方式, 来判断当前是否是节假日(包括周末和调休上班日)
  • 如果基于外网取请见 这里
  • 工具类实现思路:
    将国家法定节假日和调休上班日的日期写入文本中, 然后读取该文本, 将加班日和节假日分别放入一个list中
    然后将当前毫秒数转成当前日期(年月日), 然后依次判断是否是法定节假日, 调休加班日和周末
  • 计算逻辑:
    法定工作日= 调休加班日 + 非法定节假日 + 平时工作日(周1~5)
    法定休息日= 非法定工作日
    法定节假日= 不在法定节假日list中

二、实现

采取文件进行配置的初衷是: 解耦.
与其将节假日等相关日期的写入放入代码中, 不如将日期相关配置独立出来, 方便配置的同时对代码进行解耦

  1. resources 目录下(与application.properties配置文件同级)新建一个文件 holiday.txt
    存放当年的法定节假日和调休加班日等日期, 例如今年的配置

    #######法定节假日日期#######
    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
    
  2. 每年大概10月份左右会出现第二年的法定节假日公告
    点击 这里 查看当年法定节假日安排

  3. 工具类代码

    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("\r\n");
            //方式一, 手动编写文件读取方法
            //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 , 可以参照 这里 解决

猜你喜欢

转载自blog.csdn.net/qq_43371556/article/details/123811246