java实现一定规则下的时间段或单元数统计

来源:互联网 发布:淘宝商城情趣用品 编辑:程序博客网 时间:2024/05/16 07:26

时间单元内单元数统计:

前期统计根据一定规则来统计,目前规则是8点12点算一个单位,12点到次日8点算一个单位。和时间段内时间长短无关。只看设备借出到归还之间,落在几个单位区间内。

比如一个摄像机,
例1:上午8点借出,当天中午12点前归还。就计1个单位;
例2:上午8点借出,当天13点归还,计2个单位(8-12;12-13)
例3:上午7点借出,当天13点归还,计3个单位(7-8;8-12;12-13)
例4:上午8点借出,第二天9点收回,计3个单位(上午8-12;下午12到第二天8;第二天8到9  各算一个)。

这个规则的时间切点,允许用户后台定义,以备未来规则修改。
比如目前是8点开始算,可能未来会变成9点,12点会变成14点。

解决方案:

/** * 以0-48为基础统计单元 * @author 张恩备 * @param a 条件数组 * @param unit 统计单元,a.lengh()-2 * @param x 开始时间int型 * @param y 结束时间int型 * @date 2016-8-24 上午11:16:50 */public static Integer count1(int[] a,int unit,int x,int y){int n=0;        for(int i=0;i<=unit;i++){            if(a[i+1] > x && x>=a[i]){                for(int j=0;j<=unit;j++){                    if(a[j+1] > y && y>=a[j]){                        n+=unit-i+j+1;                        System.out.println("--i:"+i+"--"+"j:"+j);                    }                }            }        }        return n;}/** * 统计时分秒一天0-24内的单元数 * @author 张恩备 * @param a 条件数组 * @param unit 统计单元,a.lengh()-2 * @param x 开始时间int型 * @param y 结束时间int型 * @date 2016-8-24 上午11:16:50 */public static Integer count(int[] a,int unit,int x,int y){int n=0;for(int i=0;i<=unit;i++){if(a[i+1] > x && x>=a[i]){for(int j=0;j<=unit;j++){if(a[j+1] > y && y>=a[j]){n+=2-i+j-1;System.out.println("--i:"+i+"--"+"j:"+j);}}}}return n;}public static void main(String[] args) {int[] a = new int[]{000000,80000,120000,240000};int unit=a.length-2;String start = "20160824080000";String end = "20160825090000";int startDate = Integer.parseInt(start.substring(0, 8));int startTime = Integer.parseInt(start.substring(8,14));int endDate = Integer.parseInt(end.substring(0,8));int endTime = Integer.parseInt(end.substring(8,14));System.out.println("--startDate--"+startDate+"--endDate--"+endDate);System.out.println("--startTime--"+startTime+"--endTime--"+endTime);int m = endDate-startDate;        int n = count(a,unit,startTime,endTime);        System.out.println("--一天:"+n+"单元");        System.out.println("--一共:"+(m*unit+n)+"单元");    }

时间段内时长统计:

演播室使用统计中加班时段为每天的00:00-8:00,12:00-14:30,18:00-24:00,以及周末节假日全天。
如果任务单时间属于加班时间内,需要统计出加班时间。统计中正常使用时间和加班时间要分别统计。
比如一个节目单使用时间为7:00到9:00,则加班时间计1小时,正常时间计1小时

解决方案:

public static void main(String args[]){//开始、结束int start = 0;int end = 540;List<Integer> usetimeFinal = timehandler(start, end);List<Integer> usetime = new ArrayList<Integer>();//加班时间段--真实环境start-end为一组int[] overtimeStart =new int[]{0,480,1080};int[] overtimeEnd = new int[]{60,540,1140};//overtimeDTO otd = new overtimeDTO();//List<overtimeDTO> list = new ArrayList<overtimeDTO>();int unit=overtimeStart.length;int n = 0;for(int i=0;i<unit;i++){List<Integer> usetimeTemp = new ArrayList<Integer>();usetimeTemp.addAll(usetimeFinal);//List<Integer> overtime = timehandler(list.get(i).getStart(), list.get(i).getEnd());List<Integer> overtime = timehandler(overtimeStart[i],overtimeEnd[i]);usetimeTemp.retainAll(overtime);if(usetimeTemp.size() != 0){n++;//结合四分五裂原理,避免组合数组中间拼接产生的时间段usetime.addAll(usetimeTemp);}}int overtime = usetime.size() - n;usetimeFinal.removeAll(usetime);int normaltime = usetimeFinal.size() -1 + n;//去除0点System.out.println("加班时间:" + overtime * 15 + " , 正常时间:" + normaltime * 15);}/** * 时间以指定15分钟分割 * @author 张恩备 * @date 2016-8-25 下午02:26:58 */public static List<Integer> timehandler(int start,int end){List<Integer> point = new ArrayList<Integer>();for(int i = start / 15; i <= end / 15; i++){point.add(i);}return point;}

0 0
原创粉丝点击