1. 程式人生 > >java實現一定規則下的時間段或單元數統計

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;
	}