如何比较android中的两个日期范围?

ibps3vxo  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(298)

我目前正试图弄清楚如何使用java中的calendar对象比较这两个日期范围。
例如,如果前两个给定日期为 2021-7-1 and 2021-7-8 第二个给定的日期是 2021-7-8 and 2021-7-10 ,它应该返回false,因为前两个给定日期和后两个给定日期的日期范围在 2021-7-8 .
有没有可能使用日历和日期对象来解决这个问题?

ovfsdjhp

ovfsdjhp1#

tl;博士

LocalDateRange a = LocalDateRange.ofClosed(
    LocalDate.parse( "2021-07-01" ) ,
    LocalDate.parse( "2021-07-08" )
)
.abuts(                                            // Or .overlaps or .isConnected
    LocalDateRange b = LocalDateRange.ofClosed(
        LocalDate.parse( "2021-07-08" ) ,
        LocalDate.parse( "2021-07-10" )
    )
)

避免遗留日期时间类

使用日历对象
从不使用 CalendarDate . 这些可怕的类在几年前被JSR310中定义的java.time类所取代。

日期范围

如果前两个给定日期为2021-7-1和2021-7-8,而后两个给定日期为2021-7-8和2021-7-10,则应返回false,因为前两个给定日期和后两个给定日期的日期范围在2021-7-8被覆盖。
您想比较两个日期范围。

本地日期

在现代java中,我们使用 LocalDate 表示一个日期,该日期没有一天中的某个时间,也没有时区的上下文或utc的偏移量。

org.threeten.extra.localdaterange

使用日期范围(一对 LocalDate 对象),我建议您将threeten额外库添加到您的项目中,免费且开源。这个图书馆包括 LocalDateRange 同学们,这正是你们需要的。

半开式跨度

您应该知道,在日期-时间处理中,将时间跨度定义为半开放式通常是有意义的,其中开始是包含的,而结束是独占的。因此,一整天从一天的第一刻开始,一直持续到第二天的第一刻,但不包括第二天的第一刻。
在您的情况下,第一个范围在8号结束,第二个范围从8号开始。根据半开放的规则,这两个范围将相邻而不是重叠。

LocalDateRange x = LocalDateRange.of(
        LocalDate.parse( "2021-07-01" ) ,
        LocalDate.parse( "2021-07-08" )
);
LocalDateRange y = LocalDateRange.of(
        LocalDate.parse( "2021-07-08" ) ,
        LocalDate.parse( "2021-07-10" )
);

boolean abuts = x.abuts( y );
boolean overlaps = x.overlaps( y );

跑步的时候。
邻接=正确
重叠=错误
我相信,一致使用半开放式可以使代码更易于阅读和推理,并且不太可能因疏忽而出错。

全封闭跨度

但是,如果您坚持完全封闭的方法,则 LocalDateRange 类可以让您以这种方式工作。使用 LocalDateRange.ofClosed 而不是 LocalDateRange.of .

LocalDateRange a = LocalDateRange.ofClosed(
        LocalDate.parse( "2021-07-01" ) ,
        LocalDate.parse( "2021-07-08" )
);
LocalDateRange b = LocalDateRange.ofClosed(
        LocalDate.parse( "2021-07-08" ) ,
        LocalDate.parse( "2021-07-10" )
);

boolean abuts = a.abuts( b );
boolean overlaps = a.overlaps( b );

跑步的时候。
邻接=假
重叠=真
使用全封闭方法,两个范围重叠而不是相邻,这与我们在前面的示例代码中看到的相反。

重叠或邻接

注意 isConnected 方法,相当于 (overlaps(other) || abuts(other)) . 这个 LocalDateRange 类还提供了其他比较方法。

关于java.time

java.time框架内置于Java8及更高版本中。这些类取代了旧的遗留日期时间类,如 java.util.Date , Calendar , & SimpleDateFormat .
要了解更多信息,请参阅oracle教程。并搜索堆栈溢出以获得许多示例和解释。规范是JSR310。
joda time项目现在处于维护模式,建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用符合jdbc 4.2或更高版本的jdbc驱动程序。不需要字符串,也不需要 java.sql.* 上课。Hibernate5和JPA2.2支持java.time。
从哪里获得java.time类?
JavaSE8、JavaSE9、JavaSE10、JavaSE11和更高版本—标准JavaAPI的一部分,带有捆绑实现。
Java9带来了一些小功能和修复。
JavaSE6和JavaSE7
大部分java.time功能都是通过三个后端口向后移植到Java6和Java7。
安卓
android(26+)的更高版本捆绑了java.time类的实现。
对于早期的android(<26),api去糖过程带来了最初未内置到android中的java.time功能的子集。
如果desugaring不能提供您需要的功能,threetenabp项目会将threeten backport(如上所述)应用于android。了解如何使用threetenabp…。

threeten额外的项目使用额外的类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter ,等等。

相关问题