算法简介:
1.计算工作的实际工时,工作有开始和结束时间,会出现多项工作并发的情况。
2.要求计算总工时、交叉工时以及实际工时。
背景:
本算法仅是工作中遇到,简单实现并记录,请借鉴的老铁轻喷;
注意:由于csdn服务器出现问题,导致文章代码段无法排版,请谅解
package aa;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
public class test {
public static void main(String[] args) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<Time> list = new ArrayList<Time>();
Time time4 = new Time();
time4.setStartTime(format.parse("2022-12-12 10:11:11"));
time4.setEndTime(format.parse("2022-12-13 14:11:11"));
Time time5 = new Time();
time5.setStartTime(format.parse("2022-12-11 10:11:11"));
time5.setEndTime(format.parse("2022-12-12 14:11:11"));
list.add(time4);
list.add(time5);
getActualHour(list);
}
//计算实际工时
public static String getActualHour(List<Time> list){
//根据开始结束时间升序排序
List<Time> list1 = list.stream().sorted(Comparator.comparing(Time::getStartTime).thenComparing(Time::getEndTime)).collect(Collectors.toList());
//最小开始时间
Date s0 = null;
//最大结束时间
Date e0 = null;
int i=0;
//总工时
long zsTimeLong=0;
//交叉时间和
long jcTimeLong=0;
for(Time time:list1){
if(i==0){
s0 = time.getStartTime();
e0 = time.getEndTime();
zsTimeLong+=(e0.getTime()-s0.getTime())/60/60/1000;
i++;
continue;
}
//开始时间
Date s = time.getStartTime();
//结束时间
Date e = time.getEndTime();
zsTimeLong+=(e.getTime()-s.getTime())/60/60/1000;
if(s.getTime()>=e0.getTime()){
//1的开始时间大于等于0的结束时间
//不存在交叉时间
s0=s;
e0=e;
}else{
//存在交叉时间
if(s.getTime()>=s0.getTime()){
//1的开始时间大于等于0的开始时间
if(e.getTime()>=e0.getTime()){
//1的结束时间大于等于0的结束时间
//计算交叉的时间
jcTimeLong+=(e0.getTime()-s.getTime())/60/60/1000;
e0=e;
}else{
//1的结束时间小于等于0的结束时间
//计算交叉的时间
jcTimeLong+=(e.getTime()-s.getTime())/60/60/1000;
}
}else {
s0=s;
//1的开始时间小于等于0的开始时间
if(e.getTime()<=e0.getTime()){
//1的结束时间小于等于0的结束时间
//计算交叉的时间
jcTimeLong+=(e.getTime()-s0.getTime())/60/60/1000;
}else if(e.getTime()>=e0.getTime()){
//1的结束时间大于等于0的结束时间
//计算交叉的时间
jcTimeLong+=(e0.getTime()-s0.getTime())/60/60/1000;
e0=e;
}
}
}
}
System.out.println("总时间/h:"+zsTimeLong);
System.out.println("交叉时间/h:"+jcTimeLong);
System.out.println("实际工时/h:"+(zsTimeLong-jcTimeLong));
return String.valueOf(zsTimeLong-jcTimeLong);
}
}
class Time{
private Date startTime;
private Date endTime;
public Long getLongTime() {
return endTime.getTime()-startTime.getTime();
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
}