计算每天工时逻辑,去掉可能重叠交叉的数据(由于前端插件存储["11:30","12:00"] 这样的json字符串)



private  Double  countTimes(List<Record> list) throws ParseException {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    SimpleDateFormat DateFormat = new SimpleDateFormat("yyyy-MM-dd");
    List al=new ArrayList();
    for(int i=0;i<list.size();i++){
        Record r=list.get(i);
        String s = r.getWorkTime();//获得的参数 ["11:30","12:00"]
        if(StringUtils.isNotNull(s)){


            Object[] times = JSONArray.parseArray(s).toArray();
            Long [] oj=new Long[times.length];
            for (int k = 0; k < times.length; k++) {
                String time = DateFormat.format(new Date()) + " " + times[k] + ":00";
                oj[k]=simpleDateFormat.parse(time).getTime()/1000;
            }
            if(times.length==2){

                if(i==0){//取出第一次入参的参数作为参照对象
                    al.add(oj[0]);
                    al.add(oj[1]);
                }else{//下面是比较去除交叉重叠的时间算法逻辑
                    for(int j=0;j<al.size()/2;j++){
                        if(oj[0]<Convert.toLong(al.get(j*2))){
                            if(oj[1]<Convert.toLong(al.get(j*2))){
                                if(j==0||(j>0&&oj[0]>Convert.toLong(al.get(j*2-1)))){
                                    al.add(2*j,oj[0]);
                                    al.add(2*j+1,oj[1]);
                                    break;
                                }
                            }else{
                                if(oj[1]<Convert.toLong(al.get(2*j+1))){
                                    if(j>0&&oj[0]<=Convert.toLong(al.get(2*j-1))){
                                        al.remove(j*2);
                                        al.remove(j*2-1);
                                    }else {
                                        al.remove(j*2);
                                        al.add(j*2,oj[0]);
                                    }
                                }else{
                                    if(j>0&&oj[0]<Convert.toLong(al.get(2*j-1))){
                                        al.remove(j*2);
                                        al.remove(j*2);
                                    }else {
                                        al.remove(j*2);
                                        al.add(j*2,oj[0]);
                                        al.remove(j*2+1);
                                        al.add(j*2+1,oj[1]);
                                    }

                                }
                            }
                        }else{
                            if(oj[0]>Convert.toLong(al.get(2*j+1))){
                                if((al.size()-(2*j+1))<=1) {
                                    al.add(oj[0]);
                                    al.add(oj[1]);
                                    break;
                                }
                            }else {
                                if(oj[1]>Convert.toLong(al.get(2*j+1))){
                                    al.remove(2*j+1);
                                    al.add(2*j+1,oj[1]);
                                }
                            }
                        }
                    }
                }

            }
        }

    }

    double h=0.00;
    for(int l=0;l<al.size()/2;l++){
        long max=Convert.toLong(al.get(l*2+1))/60;
        long min=Convert.toLong(al.get(l*2))/60;
        double f1 = new BigDecimal((float)(max-min)/60).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        h+=f1;
        logger.info("f1="+f1);
        logger.info("h="+h);
    }

return h;

}

 

posted @ 2020-04-02 14:27  海代码  阅读(242)  评论(0编辑  收藏  举报