多个时间段重合过滤

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



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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值