计算每天工时逻辑,去掉可能重叠交叉的数据(由于前端插件存储["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; }