java實現一定規則下的時間段或單元數統計
阿新 • • 發佈:2019-02-14
時間單元內單元數統計:
前期統計根據一定規則來統計,目前規則是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; }