前言
场景:公司业务人员在录入项目的时候,填写项目截止时间,如果截止时间小于工作日6小时,需要给出提示,防止预留时间不足,领导还没有批,项目就失效的情况。
代码展示
用到的工具包:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.5</version>
</dependency>
方法:
package com.sumec.controller.seo;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static void main(String[] args) throws ParseException {
// 当前时间
Date now = new Date();
// 截止时间
String line = "2022-06-03 18:30:30";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date lineDate = sdf.parse(line);
// 工作日时间8小时
int workDayHours = 8;
DateTime beginTime = DateTime.of(now);
DateTime endTime = DateTime.of(lineDate);
// 开始日期的上班时间和下班时间
Date beginStartWork = sdf.parse(beginTime.toDateStr() + " 09:00:00");
Date beginAfterWork = sdf.parse(beginTime.toDateStr() + " 18:00:00");
// 截止日期的上班时间和下班时间
Date endStartWork = sdf.parse(endTime.toDateStr() + " 09:00:00");
Date endAfterWork = sdf.parse(endTime.toDateStr() + " 18:00:00");
long totalWorkHours = 0;
// 计算两个日期之间的天数差
long daySub = DateUtil.between(DateUtil.truncate(now, DateField.DAY_OF_YEAR), DateUtil.truncate(lineDate, DateField.DAY_OF_YEAR), DateUnit.DAY, false);
if (daySub > 1) {
int weekendDays = 0;
// 取两个日期的当天0点作为计算天,计算两个日期之间的周末的天数
DateTime start = DateUtil.truncate(now, DateField.DAY_OF_YEAR);
DateTime end = DateUtil.truncate(lineDate, DateField.DAY_OF_YEAR);
while (DateUtil.between(start, end, DateUnit.DAY, false) > 1) {
if (start.isWeekend()) {
weekendDays ++;
}
start = start.offset(DateField.DAY_OF_YEAR, 1);
}
// 计算两个日期之间的整工作日,排除前后两个日期
long workDays = ( daySub - weekendDays - 2 ) < 0 ? 0 : ( daySub - weekendDays - 2 );
totalWorkHours = workDays * workDayHours;
// 计算前后两个工作日的工作小时数
if (!beginTime.isWeekend()) {
totalWorkHours += ( now.before(beginStartWork) ) ? 8 : ( now.after(beginAfterWork) ? 0 : DateUtil.between(beginTime, beginAfterWork, DateUnit.HOUR, false) );
}
if (!endTime.isWeekend()) {
totalWorkHours += ( lineDate.before(endStartWork) ) ? 0 : ( lineDate.after(endAfterWork) ? 8 : DateUtil.between(endStartWork, lineDate, DateUnit.HOUR, false) );
}
}
else if (daySub == 1) {
// 计算前后两个工作日的工作小时数
if (!beginTime.isWeekend()) {
totalWorkHours += ( now.before(beginStartWork) ) ? 8 : ( now.after(beginAfterWork) ? 0 : DateUtil.between(beginTime, beginAfterWork, DateUnit.HOUR, false) );
}
if (!endTime.isWeekend()) {
totalWorkHours += ( lineDate.before(endStartWork) ) ? 0 : ( lineDate.after(endAfterWork) ? 8 : DateUtil.between(endStartWork, lineDate, DateUnit.HOUR, false) );
}
}
else {
if (now.before(beginStartWork) && lineDate.after(beginAfterWork)) {
totalWorkHours = 8;
}
else if (now.after(beginStartWork) && lineDate.after(beginAfterWork)) {
totalWorkHours = DateUtil.between(now, beginAfterWork, DateUnit.HOUR, false);
}
else if (now.before(beginStartWork) && lineDate.before(beginAfterWork)) {
totalWorkHours = DateUtil.between(beginStartWork, lineDate, DateUnit.HOUR, false);
}
else if (now.after(beginStartWork) && lineDate.before(beginAfterWork)) {
totalWorkHours = DateUtil.between(now, lineDate, DateUnit.HOUR, false);
}
}
System.out.println("当前时间[ " + beginTime + " ]到截止时间[ "+ endTime +" ]的工作日小时数:" + totalWorkHours);
}
}