判定日期是否为工作日


前言

本文用来记录代码编写过程中的一些小的项目

一、如何判定日期为工作日

首先java自带有判断周几的函数---dataTime.getDayOfWeek(),那么我们还需要知道今年的具体节假日和增加的调休所在的日期,这个可以根据国务院官网查看手动填写,也可以去网上搜一下有相应的接口。

二、使用步骤

1.引入库

代码如下(示例):

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

2.添加工作日和节假日

代码如下(示例):

/**
     *  初始化节假日,后续修改可以调用网上接口也可以手动添加,来进行每年的自动更新假期。
     */
    public static void initHoliday(){
        holiday.add("2023-01-01");
        holiday.add("2023-01-02");
        holiday.add("2023-01-21");
        holiday.add("2023-01-22");
        holiday.add("2023-01-23");
        holiday.add("2023-01-24");
        holiday.add("2023-01-25");
        holiday.add("2023-01-26");
        holiday.add("2023-01-27");
        holiday.add("2023-04-05");
        holiday.add("2023-04-29");
        holiday.add("2023-04-30");
        holiday.add("2023-05-01");
        holiday.add("2023-05-02");
        holiday.add("2023-05-03");
        holiday.add("2023-06-22");
        holiday.add("2023-06-23");
        holiday.add("2023-06-24");
        holiday.add("2023-09-29");
        holiday.add("2023-09-30");
        holiday.add("2023-10-01");
        holiday.add("2023-10-02");
        holiday.add("2023-10-03");
        holiday.add("2023-10-04");
        holiday.add("2023-10-05");
        holiday.add("2023-10-06");
    }
    /**
     *  初始化额外加班日,同节假日。
     */
    public static void initExtraWorkDay(){
        extraWorkDay.add("2023-01-28");
        extraWorkDay.add("2023-01-29");
        extraWorkDay.add("2023-04-23");
        extraWorkDay.add("2023-05-06");
        extraWorkDay.add("2023-06-25");
        extraWorkDay.add("2023-10-07");
        extraWorkDay.add("2023-10-08");
    }

3.进行工作日和工作时间的判断

代码如下(示例):

    static List<String> holiday =new ArrayList<>();
    static List<String> extraWorkDay =new ArrayList<>();
    public static Boolean isWorkingDay(long time) {
        LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneOffset.of("+8"));
        String formatTime = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        //初始化
        initHoliday();
        initExtraWorkDay();
        //是否加班日
        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;

    }
    public static Boolean isWorkingTime(String serviceStartTime ,String serviceEndTime) throws ParseException {
        String start = serviceStartTime;
        String end = serviceEndTime;
        //传递进来的参数格式为HH:mm(例: 04:23 )将其转化为date格式(Thu Jan 01 18:23:00 CST 1970)
        String format = "HH:mm";
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date startDate = sdf.parse(start);
        Date endDate = sdf.parse(end);
        // 创建一个 Calendar 对象
        Calendar startCalendar = Calendar.getInstance();
        Calendar endCalendar = Calendar.getInstance();
        // 将 Date 对象设置为要转换的日期
        startCalendar.setTime(startDate);
        endCalendar.setTime(endDate);
        // 获取服务开始时间时分秒、转化为秒数进行比较
        int startHour=startCalendar.get(Calendar.HOUR_OF_DAY);//小时
        int startMinute=startCalendar.get(Calendar.MINUTE);//分
        int startSecond=startCalendar.get(Calendar.SECOND);//秒
        int startTotalTime = startHour*3600+startMinute*60+startSecond;
        //获取服务结束时间时分秒,转化为秒数进行比较
        int endHour=endCalendar.get(Calendar.HOUR_OF_DAY);//小时
        int endMinute=endCalendar.get(Calendar.MINUTE);//分
        int endSecond=endCalendar.get(Calendar.SECOND);//秒
        int endTotalTime = endHour*3600+endMinute*60+endSecond;
        //获取当前时间时分秒,转化为秒数与服务开始时间、结束时间进行比较。
        Calendar nowCalendar = Calendar.getInstance();
        int nowCalendarHour=nowCalendar.get(Calendar.HOUR_OF_DAY);//小时
        int nowCalendarMinute=nowCalendar.get(Calendar.MINUTE);//分
        int nowCalendarSecond=nowCalendar.get(Calendar.SECOND);//秒
        //转化为秒进行比较
        int nowCalendarTotalTime = nowCalendarHour*3600+nowCalendarMinute*60+nowCalendarSecond;
        if(nowCalendarTotalTime>=startTotalTime && nowCalendarTotalTime<=endTotalTime)
            return true;
        else
            return false;
    }

4.主函数

代码如下(示例):

public static Boolean isWorkingDayAndTime(long time,String serviceStartTime,String serviceEndTime) throws ParseException {
        //只有同时满足工作日和工作时间才会返回true
        if(isWorkingDay(time) && isWorkingTime(serviceStartTime,serviceEndTime))
        return true;
        else return false;
}

只有当传递的参数在工作日和serviceStartTime和serviceEndTime时才会返回True,其余时间返回False

4.完整代码

代码如下(示例):

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class HolidayService {

    static List<String> holiday =new ArrayList<>();
    static List<String> extraWorkDay =new ArrayList<>();
    public static Boolean isWorkingDay(long time) {
        LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneOffset.of("+8"));
        String formatTime = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        //初始化
        initHoliday();
        initExtraWorkDay();
        //是否加班日
        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;

    }
    public static Boolean isWorkingTime(String serviceStartTime ,String serviceEndTime) throws ParseException {
        String start = serviceStartTime;
        String end = serviceEndTime;
        //传递进来的参数格式为HH:mm(例: 04:23 )将其转化为date格式(Thu Jan 01 18:23:00 CST 1970)
        String format = "HH:mm";
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date startDate = sdf.parse(start);
        Date endDate = sdf.parse(end);
        // 创建一个 Calendar 对象
        Calendar startCalendar = Calendar.getInstance();
        Calendar endCalendar = Calendar.getInstance();
        // 将 Date 对象设置为要转换的日期
        startCalendar.setTime(startDate);
        endCalendar.setTime(endDate);
        // 获取服务开始时间时分秒、转化为秒数进行比较
        int startHour=startCalendar.get(Calendar.HOUR_OF_DAY);//小时
        int startMinute=startCalendar.get(Calendar.MINUTE);//分
        int startSecond=startCalendar.get(Calendar.SECOND);//秒
        int startTotalTime = startHour*3600+startMinute*60+startSecond;
        //获取服务结束时间时分秒,转化为秒数进行比较
        int endHour=endCalendar.get(Calendar.HOUR_OF_DAY);//小时
        int endMinute=endCalendar.get(Calendar.MINUTE);//分
        int endSecond=endCalendar.get(Calendar.SECOND);//秒
        int endTotalTime = endHour*3600+endMinute*60+endSecond;
        //获取当前时间时分秒,转化为秒数与服务开始时间、结束时间进行比较。
        Calendar nowCalendar = Calendar.getInstance();
        int nowCalendarHour=nowCalendar.get(Calendar.HOUR_OF_DAY);//小时
        int nowCalendarMinute=nowCalendar.get(Calendar.MINUTE);//分
        int nowCalendarSecond=nowCalendar.get(Calendar.SECOND);//秒
        //转化为秒进行比较
        int nowCalendarTotalTime = nowCalendarHour*3600+nowCalendarMinute*60+nowCalendarSecond;
        if(nowCalendarTotalTime>=startTotalTime && nowCalendarTotalTime<=endTotalTime)
            return true;
        else
            return false;
    }
public static Boolean isWorkingDayAndTime(long time,String serviceStartTime,String serviceEndTime) throws ParseException {
        //只有同时满足工作日和工作时间才会返回true
        if(isWorkingDay(time) && isWorkingTime(serviceStartTime,serviceEndTime))
        return true;
        else return false;


}

    /**
     *  初始化节假日,后续修改可以调用网上接口,来进行每年的自动更新假期。
     */
    public static void initHoliday(){
        holiday.add("2023-01-01");
        holiday.add("2023-01-02");
        holiday.add("2023-01-21");
        holiday.add("2023-01-22");
        holiday.add("2023-01-23");
        holiday.add("2023-01-24");
        holiday.add("2023-01-25");
        holiday.add("2023-01-26");
        holiday.add("2023-01-27");
        holiday.add("2023-04-05");
        holiday.add("2023-04-29");
        holiday.add("2023-04-30");
        holiday.add("2023-05-01");
        holiday.add("2023-05-02");
        holiday.add("2023-05-03");
        holiday.add("2023-06-22");
        holiday.add("2023-06-23");
        holiday.add("2023-06-24");
        holiday.add("2023-09-29");
        holiday.add("2023-09-30");
        holiday.add("2023-10-01");
        holiday.add("2023-10-02");
        holiday.add("2023-10-03");
        holiday.add("2023-10-04");
        holiday.add("2023-10-05");
        holiday.add("2023-10-06");
    }
    /**
     *  初始化额外加班日,同节假日。
     */
    public static void initExtraWorkDay(){
        extraWorkDay.add("2023-01-28");
        extraWorkDay.add("2023-01-29");
        extraWorkDay.add("2023-04-23");
        extraWorkDay.add("2023-05-06");
        extraWorkDay.add("2023-06-25");
        extraWorkDay.add("2023-10-07");
        extraWorkDay.add("2023-10-08");
    }
}

总结

本文提供了一个较为简单的判断工作日的方法,使用两个list<string>来进行节假日和加班日的存储,并进行判断。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值