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

时间:2022-12-17 22:41:29

时间单元内单元数统计:

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