节点 - 多个日期范围重叠



我有一个日期范围,每个日期范围都有自己的开始日期,结束日期和唯一的ID。我想拥有所有重叠的日期范围(知道与哪个范围和哪个范围重叠,例如,甚至可能是3个日期范围[1,3,8],在08:00-08:10和[1.3]重叠在08:00-18:15(

我在这里找到了我的问题:dateTime -确定多个(n(dateTime是否在r中互相重叠但是答案是在R中,我没有设法遵循逻辑

我确实知道在第一个开始日期和最后一个结束日期之间按分钟进行调整的解决方案,并检查哪个日期范围包含分钟数,但我希望获得更优雅的解决方案,而不会大量的速度,数据

我很乐意在C#,JavaScript,Typescript,Python,Java或仅在逻辑上进行英语解释(我更喜欢没有第三部分的库,但也许是MONM JS(

此问题的标准逻辑是将您的间隔转变为事件对,打开的点以及关闭的点。然后按日期对事件进行排序,然后打开/关闭。(如果您在打开的前面进行排序,则当另一个打开时,当一个人结束时,您就不算是一个交叉。如果您在封闭的前面进行排序,则将其算作交叉点。(跟踪目前打开哪些间隔,您可以阅读答案。

半开

通常,日期时间处理中的最佳实践是使用半开场的方法定义时间跨度,其中开始是包含的,而结束是 excrupedy

所以一天从一天的第一时刻开始,跑到但不包括第二天的第一时刻。这避免了试图确定第一天最后一刻的无限分数第二秒的问题。

一个月的跨度从本月的第一个开始,直到下个月的第一天,但确实包括。因此,2月的2月1日至3月1日运行,无需确定leap年,也无需确定任何月份的长度。

午餐时间从中午开始,但不包括,但不包括下午1点:12:00 - 13:00。下一堂课的时间为下午1点至下午2点:13:00 - 14:00。这个午餐期和上课时间几乎彼此相处,但重叠(因为午餐13:00是独家的(。

另外,在整个代码库中始终使用半开您的方法使您的代码更容易阅读,并且认知负担较低。半开的方法使停止启动的时间间隔彼此相处,以便于更轻松地进行比较。

比较

比较间隔很容易。

对于重叠

( X.start > Y.stop ) && ( X.stop > Y.start )

对象

在面向对象的环境上,您应该编写一个类以表示每个停止启动间隔。基于与"包含","重叠"等方法的比较代码构建。

java.Time

在Java中,我们很幸运拥有该行业中最佳的日期时间框架, java.time

内置功能进一步扩展了 threeten-extra project的类( java.time的定义是JSR 310(。

in threeten-extra 您会找到一对Instant对象的Interval类。Instant是一个时刻,在UTC中的时间表上,纳米秒的分辨率。对于仅日期值(LocalDate(,请使用LocalDateRange类。

两个类都已经实施了您可能需要的所有比较方法。

  • 基因
  • 包含
  • 封闭
  • 等于
  • 交叉点
  • ISAFTER
  • IS Connected
  • Isempty
  • 重叠
  • 跨度
  • 联合

这些类是开源的,因此您可以仔细阅读算法。

请注意,intersection为您提供了两对间隔之间重叠的间隔。

union方法为您提供了最早开始和最新停止的间隔。到目前为止,您可以维持对所有比较的不断增长。这告诉您下一个比较是否完全位于所有先前的间隔之后,从而使您免于不必要的比较。

最新更新