首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何比较Android中的两个日期范围?

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

Stack Overflow用户
提问于 2021-07-08 04:37:38
回答 1查看 259关注 0票数 0

我目前正在努力弄清楚如何使用java中的Calendar对象来比较这两个日期范围。

例如,如果前两个给定日期为2021-7-1 and 2021-7-8,而第二个给定日期为2021-7-8 and 2021-7-10,则应返回false,因为前两个给定日期和第二个给定日期的日期范围在2021-7-8处被覆盖。

是否有可能使用Calendar和Date对象来解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-08 05:01:35

tl;dr

代码语言:javascript
复制
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" )
    )
)

避免遗留日期-时间类

使用Calendar对象

永远不要使用CalendarDate。这些可怕的类几年前被JSR 310中定义的java.time类所取代。

日期范围

如果前两个给定日期是2021-7-1和2021-7-8,第二个给定日期是2021-7-8和2021-7-10,则返回错误,因为前两个给定日期和第二个给定日期的日期范围覆盖在2021-7-8。

您要比较两个日期范围。

LocalDate

在现代Java中,我们使用LocalDate来表示一个日期,它没有一天的时间,也没有时区的上下文或与UTC相距的内容。

org.threeten.extra.LocalDateRange

要使用日期范围(一对LocalDate对象),我建议您将https://www.threeten.org/threeten-extra/库添加到您的项目中,免费和开源。这个库包含LocalDateRange类,这正是您所需要的。

半开跨度

您应该知道,在日期时间处理中,通常有必要将一段时间定义为“半开放”,其中开始是包含的,而结束是独占的。因此,一整天从一天的第一分钟开始,一直持续到第二天的第一分钟,但不包括在内。

在你的例子中,你的第一个范围在8号结束,第二个范围从8号开始。根据半开放规则,这两个范围将是巴布而不是重叠

代码语言:javascript
复制
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

代码语言:javascript
复制
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

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/package-summary.html框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见http://docs.oracle.com/javase/tutorial/datetime/TOC.html。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310

http://www.joda.org/joda-time/项目现在在维护模式中,建议迁移到java.time类。

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 4.2。不需要字符串,也不需要java.sql.*类。Hibernate 5&JPA2.2支持java.time。

在哪里获得java.time类?

三次-额外项目使用其他类扩展java.time。这个项目是将来可能加入java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter更多

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68295720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档