【问题标题】: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 的原件询问重叠日期范围,但没有找到。因此,我的回答和我的赞成票。

标签: java date groovy


【解决方案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 类?

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

【讨论】:

    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2019-04-26
    相关资源
    最近更新 更多