我目前正在努力弄清楚如何使用java中的Calendar对象来比较这两个日期范围。
例如,如果前两个给定日期为2021-7-1 and 2021-7-8,而第二个给定日期为2021-7-8 and 2021-7-10,则应返回false,因为前两个给定日期和第二个给定日期的日期范围在2021-7-8处被覆盖。
是否有可能使用Calendar和Date对象来解决这个问题?
发布于 2021-07-08 05:01:35
tl;dr
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对象
永远不要使用Calendar或Date。这些可怕的类几年前被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号开始。根据半开放规则,这两个范围将是巴布而不是重叠。
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
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/package-summary.html框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.Date、Calendar和SimpleDateFormat。
要了解更多信息,请参见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的试验场。您可以在这里找到一些有用的类,如Interval、YearWeek、YearQuarter和更多。
https://stackoverflow.com/questions/68295720
复制相似问题