引用
可分以下三种情况
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;
分享到:
相关推荐
java 判断两个时间段是否重叠的案例.docx
有时候我们在计算时间时,有让获取两时间段重合的天数这种需求,小编也是遇到了这样的需求,就封装了一个工具类,希望能帮助到大家。 例如求(2022-05-02 00:00:00 至 2022-05-12 23:59:59) 时间段和(2022-05-04 ...
自动重合闸动作时间的整定原则 (1)单侧电源所采用的三相重合闸时间,除应大于故障点熄弧时间及周围介质去游离的时间外,还应大于断路器及操动机构复归原状准备好再次动作的时间。 (2)双侧电源线路的自动重合闸...
计算两张图像的重合率,如果有一个标准数据集,一个程序计算的数据集,计算两个数据集的准确率、召回率及F1-measure;将两个图像进行点乘,重叠区域面积S,标准数据集面积S1,程序计算得到的数据集面积S2,则召回率=...
利用matlab找出连个面距离最小的点的程序,读者可以根据具体情况进行简单开发。
重合指数学过密码学的人都知道计算他的重要性,python实现又快又好
自适应重合闸技术的研究,相当好的资料
输电线路自动重合闸装置的作用和应满足的基本要求,单侧电源线路自动重合闸装置的接线及工作原理,双侧电源线路自动重合闸装置应考虑的特殊问题及无电压检定和同步检定的三相自动重合闸的工作原理,自动重合闸与继电...
电力系统自动重合闸matlab仿真.pdf
unity3d在2d游戏中同时拖动多个collider,
单相自适应重合闸新原理的研究单相自适应重合闸新原理的研究单相自适应重合闸新原理的研究
时针与分针重合的C#代码。时针与分针重合的C#代码。时针与分针重合的C#代码
系统介绍了重合闸原理与应用注意事项
重合指数法的研究,谢清霞,于灏,本文主要研究了重合指数法的历史背景、来源、基本原理及其应用。并结合重合指数法,介绍了Vigenère密码和Kasiski测试法的相关知识。��
ArcGIS如何把多个tif影像合成一个tif影像 在ArcGIS软件中进行日常影像(栅格)数据的拼接与提取(裁剪)的工具与方法。影像的拼接常用到的工具是Mosaic和Mosaic To New Raster
当jtopo两个节点间有多条连线时,连线的路径会重合,特别是有正反方向的两条连线时,问题尤为严重,附件彻底完美解决了这一问题,如果没有解决,你来打我脸,欢迎大家留言。
220kv电网,200km线路距离保护与零序电流保护+重合闸simulink模型
ViewPagerDemo两个viewpager重合问题,这个问题有时候有些头疼,app主页很常见,事件分发机制
易语言源码易语言判断矩形重合源码.rar
python画图出图计算图形重合面积