`
jbeduhai
  • 浏览: 506057 次
  • 性别: 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;

分享到:
评论

相关推荐

    java 判断两个时间段是否重叠的案例.docx

    在判断两个时间段是否重叠时,我们可以使用以下思路:当整个时间段作为一个整体时,只有时间段小于或大于另一个时间段时,它们才没有重叠的交集。 下面是实现代码: ```java package com.abc.common.util; import...

    计算两时间段的重合天/小时/分钟/秒数的工具类

    有时候我们在计算时间时,有让获取两时间段重合的天数这种需求,小编也是遇到了这样的需求,就封装了一个工具类,希望能帮助到大家。 例如求(2022-05-02 00:00:00 至 2022-05-12 23:59:59) 时间段和(2022-05-04 ...

    自动重合闸动作时间原则自动重合闸动作时限的选择原则

    自动重合闸动作时间的整定原则 (1)单侧电源所采用的三相重合闸时间,除应大于故障点熄弧时间及周围介质去游离的时间外,还应大于断路器及操动机构复归原状准备好再次动作的时间。 (2)双侧电源线路的自动重合闸...

    基于PLC自动重合闸设计.doc

    自动重合闸装置的设计需要考虑多个因素,例如列车的速度和距离、重合闸的型号和参数、铁路信号系统的要求等。在设计过程中,需要对重合闸的工作原理和PLC控制系统进行深入了解,并对其进行详细的设计和测试。 三、...

    电力系统自动重合闸matlab仿真.pdf

    在过渡期时,故障切除 A 相的电压电流开始恢复正常,过了一段时间的不稳定后,三相线路的电压电流恢复到正常状态。 本资源提供了关于电力系统自动重合闇的详细分析,包括其原理、优缺点、启动方式和 Matlab 仿真...

    自动重合闸装置 动重合闸装置的接线及工作原理

    例如,DH-2A型重合闸继电器就是典型的实现方式,包含时间继电器、中间继电器、电容、充电电阻等组件,确保在故障清除后适时重合断路器。 总的来说,自动重合闸装置是电力系统稳定运行的关键技术,其设计和配置需...

    利用matlab找重合点

    利用matlab找出连个面距离最小的点的程序,读者可以根据具体情况进行简单开发。

    彻底解决jtopo连线重合的问题.rar

    然而,正如标题和描述中提到的,jtopo在处理多条节点间连线时,可能会出现连线路径重合的问题,这在显示复杂网络拓扑结构时会造成视觉混淆,影响用户体验。 这个问题主要体现在当两个节点之间存在多条连线,特别是...

    易语言源码易语言判断矩形重合源码.rar

    如果你正在学习易语言或图形学,通过阅读和理解这段代码,可以加深对矩形重合判断算法的理解,并学习如何在易语言中实现此类功能。 此外,易语言支持丰富的图形绘制和事件处理功能,使得它非常适合用于制作简单的...

    java 判断两个时间段是否重叠的案例

    Java 判断两个时间段是否重叠的案例 在 Java 中,判断两个时间段是否重叠是一种常见的需求,特别是在业务逻辑中需要检查时间段的交叉情况时。在本文中,我们将介绍如何使用 Java 判断两个时间段是否重叠,并提供...

    分布式电源对重合闸的影响及措施.pdf

    由于分布式电源可以在短时间内提供大量的电流,当电力系统发生故障,保护设备动作断开故障线路后,分布式电源可能仍会继续向故障点提供电流,从而使得断路器无法成功完成重合闸操作。 2. 分布式电源的接入可能降低...

    分布式电源对自动重合闸影响分析

    - **故障持续时间**:分布式电源提供的额外电流可能使故障持续时间延长,从而增加了重合闸失败的风险。 - **电压恢复速度**:在某些情况下,分布式电源的存在可能会减缓电压恢复的速度,进而影响重合闸的成功率。 ...

    计算重合图像的面积

    ### 计算重合图像的面积 在计算机视觉与图像处理领域中,比较两幅图像之间的相似性是一项基本且重要的任务。特别是在模式识别、图像分析等领域内,通过计算图像之间的重合度可以评估算法的性能。本文将详细介绍如何...

    时钟在24小时内重合问题

    本篇文章将探讨在一个24小时周期内,时针、分针和秒针完全重合的情况,并分析其背后的数学原理。 #### 关键知识点解析 **1. 时钟指针的基本运动规律** - **时针**: 每小时移动30度(360度/12小时)。 - **分针**...

    ArcGIS如何把多个tif影像合成一个tif影像

    在ArcGIS中,将多个tif影像合成一个tif影像的过程,主要涉及到栅格数据的镶嵌操作。这个过程可以用于整合同一地区的不同影像数据,以便于统一管理和分析。下面将详细讲解如何在ArcGIS中进行影像的镶嵌操作,并重点...

    时针与分针重合的C#代码

    这个问题涉及到基本的时间表示、数学运算以及循环结构的应用,非常适合初学者学习和练习。 #### 代码分析 ##### 方法定义 方法`SuperposeHourAndMinute()`的目标是计算一天(12小时制)内时针与分针重合的次数,并...

    ViewPagerDemo两个viewpager重合问题

    然而,在实际开发中,可能会遇到一些问题,如标题提到的“ViewPagerDemo两个viewpager重合问题”。这个问题通常发生在试图在一个布局中并排放置两个或更多ViewPager时,由于布局不当或对Android事件分发机制理解不足...

    基于PLC的自动重合闸监控系统设计.pdf

    1. 重合闸动作可靠:PLC系统能够准确地执行预设的控制逻辑和时间参数,确保断路器在故障跳闸后能够正确地进行自动重合。 2. 远程控制:通过与计算机的通信接口,运行人员可以在控制室远程控制和监测重合闸的状态,...

    单相自适应重合闸新原理的研究

    单相自适应重合闸新原理的研究单相自适应重合闸新原理的研究单相自适应重合闸新原理的研究

Global site tag (gtag.js) - Google Analytics