`
jbeduhai
  • 浏览: 497847 次
  • 性别: Icon_minigender_1
  • 来自: 山东
社区版块
存档分类
最新评论

多个时间段重合过滤

    博客分类:
  • java
 
阅读更多
引用

可分以下三种情况
1.第1种情况,判断登录时间是否大于,之前注销最大时间,如大于或等于,则直接相加此段时间
2.第2种情况,判断注销时间,是否小于 之前 最大时间记录,如小于记录的最大时间,则不做处理;
3.第3种情况,判断当前登录时间小于 之前 最大时间 且 当前注销时间  大于 之前最大时间,则:当前注销时间 - 之前最大时间= 此时间段在线时长



List result = singleObjectOperateFacade.getObjectsByQuery(sql, map,
				false);
		if(result.isEmpty()) return null;
		//组装数据
		Object[] row = new Object[5];
		List<Object[]> orgLogons = new ArrayList<Object[]>();
		int rowNum = 1;
		if (result != null && !result.isEmpty()) {
			for (int i = 0; i < result.size(); i++) {
				Object[] obj = (Object[]) result.get(i);
				orgLogons.add(obj);
			}
			
			//对集合进行排序
			// 排序
			Collections.sort(orgLogons, new Comparator<Object[]>() {
				@Override
				public int compare(Object[] o1, Object[] o2) {
					Date d1 = null, d2 = null;
					Object[] data1 = (Object[])o1;
					Object[] data2 = (Object[])o2;
					
					d1 = (Date)data1[1];
					d2 = (Date)data2[1];

					return d1.compareTo(d2);
				}
			});
			
			//统计算法
			int size = orgLogons.size();
			Date dateFrom=null;  
			Date dateTo=null;
			Date minDate = null;//最小查询时间
			Date maxDate = null;//最大时间
			String orgName =""; 
			Long seconds =0L;
			for(int i =0;i<size;i++){
				Object[] data = (Object[])orgLogons.get(i);
				orgName = (String)data[0];
				if(i==0){
					dateFrom = (Date)data[1];
					dateTo = (Date)data[2];
					minDate = (Date)data[1];
					maxDate = (Date)data[2];
					if(null == dateTo){
						dateTo = new Date();
						maxDate = new Date();
					}
					seconds =(dateTo.getTime() - dateFrom.getTime()) / 1000; //注销时间 - 登录时间  = 在线时间(秒)
				}else{
					Date logonTime = (Date)data[1]; //登录时间
					Date logoutTime = (Date)data[2];//注销时间
					if( null == logoutTime) logoutTime = new Date();
					//第1种情况,判断登录时间是否大于,之前注销最大时间,如大于或等于,则直接相加此段时间
					if(logonTime.getTime() >= maxDate.getTime()){
						seconds += (logoutTime.getTime() - logonTime.getTime()) / 1000; // 这个的除以1000得到秒,相应的60000得到分,3600000得到小时
						
						maxDate = logoutTime; //更新最大注销时间记录
					}
					//第2种情况,判断注销时间,是否小于 之前 最大时间记录,如小于记录的最大时间,则不做处理;
					else if(logoutTime.getTime() < maxDate.getTime()){
						break;
					}
					//第3种情况,判断当前登录时间小于 之前 最大时间 且 当前注销时间  大于 之前最大时间,则:当前注销时间 - 之前最大时间= 此时间段在线时长
					else if(logonTime.getTime() < maxDate.getTime() && logoutTime.getTime() > maxDate.getTime() ){
						seconds += (logoutTime.getTime() - maxDate.getTime()) / 1000; // 这个的除以1000得到秒,相应的60000得到分,3600000得到小时
						
						maxDate = logoutTime; //更新最大注销时间记录
					}
				}
			}
			int second =0;
			int minute =0;
			int hour =0;
			String timeString ="";
			if(seconds > 60) {
				minute = seconds.intValue() / 60 ;
				second = seconds.intValue() % 60 ;
			}else{
				second = seconds.intValue() ;
			}
			
			if(minute > 60 ){
				hour = minute / 60 ;
				minute = minute % 60 ;
			}
			if(hour > 0)
				timeString += hour + "小时";
			if(minute > 0)
				timeString += minute + "分" ;
			if (second > 0)
				timeString += second + "秒";
			
				
			row[0] = String.valueOf(rowNum++);
			row[1] = orgName;
			row[2] = DateUtil.get19Date(minDate);
			row[3] = DateUtil.get19Date(maxDate);
			row[4] = timeString;

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics