计算工时--算法

算法简介:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,根据你的需求,我们可以稍作修改来实现根据开始时间和结束时间计算请假天数,如果开始时间和结束时间只相差半天,则请假天数为0.5天。以下是修改后的示例代码: ```html <template> <div> <label for="start-date">开始日期:</label> <input type="date" id="start-date" v-model="startDate"> <label for="start-time">开始时间:</label> <input type="time" id="start-time" v-model="startTime"> <label for="end-date">结束日期:</label> <input type="date" id="end-date" v-model="endDate"> <label for="end-time">结束时间:</label> <input type="time" id="end-time" v-model="endTime"> <p>请假天数: {{ leaveDays }}</p> </div> </template> <script> export default { data() { return { startDate: '', startTime: '', endDate: '', endTime: '' }; }, computed: { leaveDays() { if (this.startDate && this.startTime && this.endDate && this.endTime) { const startDateTime = new Date(this.startDate + 'T' + this.startTime); const endDateTime = new Date(this.endDate + 'T' + this.endTime); const diff = endDateTime - startDateTime; const halfDayInMillis = 12 * 60 * 60 * 1000; if (diff <= halfDayInMillis) { return 0.5; } else { const days = Math.floor(diff / (24 * 60 * 60 * 1000)); return days; } } else { return 0; } } } }; </script> ``` 在这个示例中,我们添加了`startTime`和`endTime`来绑定开始时间和结束时间的输入框。我们将开始日期和开始时间、结束日期和结束时间合并成一个完整的日期时间,并将其转换为`Date`对象进行计算。如果开始时间和结束时间只相差半天(12小),则请假天数为0.5天,否则按照整天计算

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值