如何知道日期范围是不是与Java中的另一个日期范围相交 - Groovy [重复]

Posted

技术标签:

【中文标题】如何知道日期范围是不是与Java中的另一个日期范围相交 - Groovy [重复]【英文标题】:How to know if a date range intersects with another date range in Java - Groovy [duplicate]如何知道日期范围是否与Java中的另一个日期范围相交 - Groovy [重复] 【发布时间】:2019-01-13 14:13:09 【问题描述】:

场景 1:

R1 = 02/08/2018 - 20/08/2018

R2 = 06/08/2018 - 29/08/2018

 R1   |--------------|
 R2          |---------------------|

场景 2:

R1 = 02/08/2018 - 20/08/2018

R2 = 31/08/2018 - 16/09/2018

 R1   |--------------|
 R2                     |---------------------|

有两个不同的日期范围,我需要比较这些范围以确定它们是否相交。例如,在第一种情况下,范围相交,而在第二种情况下,它们不相交。日期采用dd/MM/yyyy 格式。

确定它们是否相交的最佳方法是使用 Java?

       def R1Initial = SDF.parse(u.effectiveStartDate.text())
       def R1End = SDF.parse(u.mdfSystemEffectiveEndDate.text())
       def R2Initial = SDF.parse(u.effectiveStartDate.text())
       def R2End = SDF.parse(u2.mdfSystemEffectiveEndDate.text())
       def intersects = ?????

【问题讨论】:

@Jacob 不太重复,因为该问题与语言无关。此问题是特定于语言的,使用 Groovy 和 Java。使用 Groovy,我们有该语言支持的特定解决方案,如 bdkosher 的 the Answer 所示。在 Java 中,我们可以在 java.time 类和 ThreeTen-Extra 项目中使用特定的解决方案,如 my Answer 所示。我寻找其他特定于 Java 的原件询问重叠日期范围,但没有找到。因此,我的回答和我的赞成票。 【参考方案1】:

您可以创建ranges of LocalDate instances in Groovy 2.5。范围(扩展 Iterables)有一个 intersect method,它返回两个范围之间重叠天数的集合。如果交集不为空,就知道有重叠:

import java.time.*

def r1 = (LocalDate.of(2018, 8, 2)..LocalDate.of(2018, 8, 20))
def r2 = (LocalDate.of(2018, 8, 6)..LocalDate.of(2018, 8, 29))

def overlap = r1.intersect(r2) // returns a list containing August 6th through August 20th

【讨论】:

这项工作,但是与大日期范围相交的方法成本太高。【参考方案2】:

Answer by bdkosher 看起来是正确的,它利用了 Groovy 中的一个漂亮功能。

org.threeten.extra.LocalDateRange

如果对日期范围进行大量工作,您可能会发现 ThreeTen-Extra 项目中的 LocalDateRange 类很有帮助。

该类提供了几种比较方法:abutscontainsenclosesequalsintersectionisBeforeisAfterisConnectedoverlaps、@987654@3和union

LocalDateRange r1 = 
    LocalDateRange.of( 
        LocalDate.of( 2018, 8 , 2 ) , 
        LocalDate.of( 2018 , 8 , 20 ) 
    ) 
;
LocalDateRange r2 = LocalDateRange.of( LocalDate.of( 2018 , 8 , 6 ) , LocalDate.of( 2018 , 8 , 29 ) ) ;

boolean overlaps = r1.overlaps( r2 ) ;

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获得 java.time 类?

Java SE 8Java SE 9Java SE 10 及更高版本 内置。 标准 Java API 的一部分,带有捆绑实现。 Java 9 添加了一些小功能和修复。 Java SE 6Java SE 7 大部分 java.time 功能都在ThreeTen-Backport 中向后移植到 Java 6 和 7。 Android java.time 类的 android 捆绑包实现的更高版本。 对于早期的 Android (ThreeTenABP 项目适应 ThreeTen-Backport(如上所述)。见How to use ThreeTenABP…

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuarter 和more。

【讨论】:

以上是关于如何知道日期范围是不是与Java中的另一个日期范围相交 - Groovy [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历Java中的日期范围?

如何检查日期范围选择器中的日期是不是更改?

Java:检查当前日期是不是在特定日期范围内[重复]

如何使用查询在 mysql 数据库中插入日期范围?

检查日期是不是在 sql 中的日期范围之间(不检查年份)

JQuery日期范围选择器日历与可变周