计算工时--算法

算法简介:

        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;
        }
    }
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值