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

时间单元内单元数统计:

前期统计根据一定规则来统计,目前规则是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;
	}

展开阅读全文

没有更多推荐了,返回首页