前言
本文用来记录代码编写过程中的一些小的项目
一、如何判定日期为工作日
首先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>来进行节假日和加班日的存储,并进行判断。