多个日期时间段进行合并计算时长,剔除重叠时间段

article/2025/10/22 22:56:30

多个日期时间段进行合并,算出经历的时长_itrytellyou的博客-CSDN博客_多个时间段合并多个日期时间段进行合并,算出经历的时长背景描述思路代码背景描述在公司进行人员描图模块开发时,涉及到了人员参会时长和参会次数的数据,比如一个人,两个月内开了14次会议。这里面就涉及到了,如果这个人参加的两个甚至多个会议有重叠的部分,这样的时间如何通过程序去进行合并处理。思路我们在程序中,可以将多个时间段中的两段分别“冒泡”比较,如果有重叠,那么进行合并,将这两个段去除,将合并后的时间段加入,...https://blog.csdn.net/itrytellyou/article/details/102833530        最近项目上遇到需要计算有效时长的算法问题,在多个时间段中,剔除重叠的时间段计算出时长。看了上面大佬的文章后深受启发,为了应对大量的时间参与递归冒泡比较时可能出现Stack Overflow问题,我从不同方向去实现功能。

直接上代码:

import com.houhou.emmplatform.constant.DateFormatConstant;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.*;public class TimeNode {//时间的long值private final long time;//开始时间1,结束时间-1private final long direct;//累积和private long sum = 0;public TimeNode(Date dateTime, long direct) {this.time = dateTime.getTime();this.direct = direct;}public long getDirect() {return direct;}public long getTime() {return time;}public long getSum() {return sum;}public void setSum(long sum) {this.sum = sum;}//合并有重叠区别的时间public static List<TimeNode> merge(List<TimeBucket> timeBucketList) {List<TimeNode> nodeList = new ArrayList<>(2 * timeBucketList.size());for (TimeBucket timeBucket : timeBucketList) {nodeList.add(new TimeNode(timeBucket.getStart(), 1));nodeList.add(new TimeNode(timeBucket.getEnd(), -1));}nodeList.sort(Comparator.comparing(TimeNode::getTime));//设置第一个节点的和TimeNode firstNode = nodeList.get(0);firstNode.setSum(firstNode.getDirect());//计算后续节点的累计和(上一个节点的和与当前节点的方向之和)for (int i = 1; i < nodeList.size(); i++) {TimeNode preNode = nodeList.get(i - 1);TimeNode currentNode = nodeList.get(i);currentNode.setSum(preNode.getSum() + currentNode.getDirect());}//只保留 direct=1 sum=1的开始节点 和 direct=1 sum=0的结束节点nodeList.removeIf(n -> !((n.getDirect() == 1 && n.getSum() == 1) || (n.getDirect() == -1 && n.getSum() == 0)));return nodeList;}//将 List<TimeNode> 转换成 List<TimeBucket> 类型public static List<TimeBucket> convert(List<TimeNode> nodeList) {List<TimeBucket> timeBucketList = new ArrayList<>(nodeList.size() / 2);for (int i = 0; i < nodeList.size(); i = i + 2) {long start = nodeList.get(i).getTime();long end = nodeList.get(i + 1).getTime();timeBucketList.add(new TimeBucket(new Date(start), new Date(end)));}return timeBucketList;}public static void main(String[] args) throws ParseException {List<TimeBucket> timeBucketList = new ArrayList<>();SimpleDateFormat sdf = new SimpleDateFormat(DateFormatConstant.SECOND_OF_YEAR);
//        timeBucketList.add(new TimeBucket(sdf.parse("2022-03-14 19:00:00"), sdf.parse("2022-03-15 05:00:00")));
//        timeBucketList.add(new TimeBucket(sdf.parse("2022-03-13 18:00:00"), sdf.parse("2022-03-14 05:00:00")));
//        timeBucketList.add(new TimeBucket(sdf.parse("2022-03-15 01:00:00"), sdf.parse("2022-03-15 03:00:00")));
//        timeBucketList.add(new TimeBucket(sdf.parse("2022-03-13 08:00:00"), sdf.parse("2022-03-13 12:00:00")));
//        timeBucketList.add(new TimeBucket(sdf.parse("2022-03-13 10:00:00"), sdf.parse("2022-03-14 02:00:00")));
//        timeBucketList.add(new TimeBucket(sdf.parse("2022-03-14 07:00:00"), sdf.parse("2022-03-14 13:00:00")));for (int i = 0; i < 10000; i++) {Random tsdf = new Random();Instant now = Instant.now();Instant plus = now.plus(tsdf.nextInt(10), ChronoUnit.DAYS);timeBucketList.add(new TimeBucket(new Date(plus.toEpochMilli()), new Date(plus.plus(tsdf.nextInt(10), ChronoUnit.MINUTES).toEpochMilli())));}long l = System.currentTimeMillis();System.out.println(l);List<TimeNode> nodeList = merge(timeBucketList);System.out.println((System.currentTimeMillis() - l));List<TimeBucket> timeBuckets = convert(nodeList);for (TimeBucket timeBucket : timeBuckets) {System.out.println("[" + sdf.format(timeBucket.getStart()) + "," + timeBucket.getEnd() + "]");}System.out.println("--------------------");for (TimeNode timeNode : nodeList) {System.out.println("[时间=" + sdf.format(timeNode.getTime()) + ",方向=" + timeNode.getDirect() + ",和=" + timeNode.getSum() + "]");}}}
import java.util.*;public class TimeBucket {private final Date start;private final Date end;public TimeBucket(Date start, Date end) {if (start.after(end)) {throw new IllegalArgumentException("时间段无效(开始日期需要小于结束日期)");}this.start = start;this.end = end;}public Date getStart() {return start;}public Date getEnd() {return end;}}

        思路就是用 TimeBucket 类,TimeBucket 作为中间类,可以可不用。为了方便测试,我这里就用TimeBucket 集合来批量接收开始时间和结束时间,将TimeBucket放入TimeNode,这里只存放时间的long值,是开始时间方向direct就设置为1,结束时间就为-1。

        循环遍历TimeNode,求当前节点的direct与前一个TimeNode的sum的值,设置到当前节点的sum。可以发现最后 direct=1 sum=1的开始节点 和 direct=1 sum=0的结束节点 是我们最终需要的节点。后面就能很容易计算出我们的需要的总时长了。


http://chatgpt.dhexx.cn/article/i56vpYGB.shtml

相关文章

【js】判断时间段之间是否有重叠

一、需求 可以有多个时间段&#xff08;hh:mm&#xff09;&#xff0c;添加下一个时间段以及提交时需要判断各个时间段不能交叉&#xff0c;如下图&#xff1a; 一、方法 let dateAr [{ s: 02:00, e: 03:00 },{ s: 03:00, e: 04:01 },{ s: 05:00, e: 06:00 },{ s: 07:00, e:…

SQL中的时间重叠问题

点击关注上方“SQL数据库开发”&#xff0c; 设为“置顶或星标”&#xff0c;第一时间送达干货 SQL专栏 SQL基础知识第二版SQL高级知识第二版 问题描述 时间重叠指上下两行数据的时间段有重叠部分&#xff0c;现在要找出这些在时间上有重叠的记录。 具体问题 有7个会议室&#…

判断两个时间段交集、时间重叠问题

判断两个时间段范围是否有交集(时间重叠)问题经常遇到&#xff0c;比如预约会议室开会&#xff0c;活动的开始结束等&#xff0c;本文做此分析。 前提&#xff1a;本文时间传参已做限制&#xff0c;结束时间必须大于开始时间 1、正向思维 代码如下 (oneStartTime < other…

判断时间范围是否重叠(原理)

首先问题来源&#xff1a;因为业务需求需要在前端设置一个时间范围&#xff0c;并且可以多次增加&#xff0c;但要保证时间范围不重叠。某一个时间范围内做特定的事情。 让我们来分析一下时间重叠有几种情况 第一种情况&#xff1a;R1的开始时间在R2时间范围内 图① 第二种情…

企业物联网平台如何选择?

物联网平台的考虑因素都有哪些&#xff1f; 通常&#xff0c;物联网平台在安全功能、协议、数据格式、数据分析和可视化能力&#xff0c;以及所提供的应用环境方面进行比较。有很多物联网平台&#xff0c;它们可能拥有全套功能&#xff0c;但可能仍然无法胜任客户任务需求。一…

物联网技术,主要包括哪些核心技术

物联网的关键技术有识别和感知技术&#xff0c;网络与通信技术&#xff0c;数据挖掘与融合技术。 1.识别和感知技术 最常见的就是生活的的二维码了。 通过二维码&#xff0c;我们可以和图片&#xff0c;网址&#xff0c;软件&#xff0c;整个世界联系起来。 2.网络与通信技…

什么是物联网平台

1、什么是物联网平台 阿里云物联网平台为设备提供安全可靠的连接通信能力&#xff0c;向下连接海量设备&#xff0c;支撑设备数据采集上云&#xff1b;向上提供云端API&#xff0c;服务端通过调用云端API将指令下发至设备端&#xff0c;实现远程控制。 物联网平台消息通信流程…

物联网是什么,和互联网之间主要有什么区别

物联网概念最早可追溯到1990年&#xff0c;但当时并未引起重视。而随着互联网的普及、科技的发展&#xff0c;物联网在近年来备受关注&#xff0c;并成为一个新经济增长点的战略新兴产业。 物联网(InternetofThings)&#xff0c;顾名思义就是"物物相连的互联网";更为…

物联网的应用领域有哪些?

智能仓储 目前&#xff0c;国内最成熟的智能仓储解决方案智能仓储解决方案&#xff0c;智能仓储是物流过程的一个环节&#xff0c;智能仓储的应用&#xff0c;保证了货物仓库管理各个环节数据输入的速度和准确性&#xff0c;确保企业及时准确地掌握库存的真实数据&#xff0c;…

物联网的组成包含哪些

物联网采集到的信息常常需要直接报警或者是经过计算机处理后报警&#xff0c;常见的报警形式有声、光、电&#xff08;电话、短信&#xff09;。当所选参数偏离预先设定的限度值时能进行报警的系统。 物联网的组成包含哪些 物联网大致可以分为以下四个层面&#xff0c;即&#…

物联网技术主要有哪些,目前都应用在哪些领域?

现在看这篇文章的你&#xff0c;是在用什么方式阅读这篇文章&#xff1f;是通过手机&#xff1f;还是通过电脑&#xff1f;还是平板电脑呢&#xff1f;无论您是用什么设备&#xff0c;它都是联网的。 互联网的出现是一件非常美好的事情&#xff0c;它为我们提供了以前不可能实…

物联网十大应用场景

1 智慧物流 智慧物流是新技术应用于物流行业的统称&#xff0c;指的是以物联网、大数据、人工智能等信息技术为支撑&#xff0c;在物流的运输、仓储、包装、装卸、配送等各个环节实现系统感知、全面分析及处理等功能。智慧物流的实现能大大地降低各行业运输的成本&#xff0c;…

物联网主要应用领域

一、物联网在智慧物流领域应用 &#xff08;1&#xff09;应用阶段&#xff1a; 启蒙阶段&#xff08; 2003~2004&#xff09;->起步发展与探索阶段&#xff08; 2005~2009&#xff09;->理念提升阶段 &#xff08; 2009~&#xff0c;形成三大核心技术&#xff1a;感知技…

物联网主要应用在哪些领域

随着物联网的快速发展&#xff0c;物联网在生活中的应越来越广。那么&#xff0c;物联网主要应用在哪些领域&#xff1f;下面简要谈谈物联网在工作和生活中的应用。 1、消费者物联网 随着苹果、谷歌和三星等公司将业务延伸到可穿戴设备、智能家居、汽车等领域&#xff0c;它们将…

了解物联网

物联网&#xff08;IoT&#xff0c;Internet of Things&#xff09;在互联网的基础上&#xff0c;将用户端延伸和扩展到物与物、物与人的连接。物联网模式中&#xff0c;所有物品与网络连接&#xff0c;并进行通信和场景联动。 物联网是互联网的外延。互联网通过电脑、移动终端…

什么是物联网技术?物联网主要技术有哪些?

如今&#xff0c;物联网在人们的工作和生活中&#xff0c;出现的频次越来越高。物联网技术&#xff08;Internet of Things&#xff0c;IoT&#xff09;起源于传媒领域&#xff0c;是信息科技产业的第三次革命。物联网是指通过信息传感设备&#xff0c;按约定的协议&#xff0c…

物联网的优势在哪里

随着技术相继融入我们的生活&#xff0c;我们生活、工作和与世界互动的方式也逐渐发生了改变。虽然我们可能没有意识到这一点&#xff0c;但我们周围连网设备数量却以指数级速度不断增加&#xff0c;而这些连网设备被称之为“物联网”。 简单地说&#xff0c;物联网的目的就是…

物联网目前的应用场景有哪些

现在说“万物互联”也许为时尚早&#xff0c;但是很多细分的垂直领域场景已经实现了物联网。 1. 智能家居 智能家居可能是和我们最接近&#xff0c;也是目前最普及的物联网。目前市面上销售的各种大家电&#xff0c;很多都有上网和远程控制功能。小米旗下的几乎所有家电都可以通…

微信小程序之PHP后端服务器数据库的连接处理

弄个小程序真是脑壳疼&#xff0c;好不容易把前端弄好&#xff0c;把服务器布置好&#xff0c;但是如何连接后台服务器和数据库实现数据交互呢&#xff1f;网上搜到的博客教程真是够乱的&#xff0c;对于我这种后端技术小白一点都不友好&#xff01;我摸索的好几天&#xff0c;…

《微信小程序》微信小程序用java后台连接数据库进行操作。

微信小程序与Java后台的通信 一、写在前面 最近接触了小程序的开发&#xff0c;后端选择Java&#xff0c;因为小程序的代码运行在腾讯的服务器上&#xff0c;而我们自己编写的Java代码运行在我们自己部署的服务器上&#xff0c;所以一开始不是很明白小程序如何与后台进行通信…