我目前正试图弄清楚如何使用java中的calendar对象比较这两个日期范围。例如,如果前两个给定日期为 2021-7-1 and 2021-7-8 第二个给定的日期是 2021-7-8 and 2021-7-10 ,它应该返回false,因为前两个给定日期和后两个给定日期的日期范围在 2021-7-8 .有没有可能使用日历和日期对象来解决这个问题?
2021-7-1 and 2021-7-8
2021-7-8 and 2021-7-10
2021-7-8
ovfsdjhp1#
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 或 Date . 这些可怕的类在几年前被JSR310中定义的java.time类所取代。
Calendar
Date
如果前两个给定日期为2021-7-1和2021-7-8,而后两个给定日期为2021-7-8和2021-7-10,则应返回false,因为前两个给定日期和后两个给定日期的日期范围在2021-7-8被覆盖。您想比较两个日期范围。
在现代java中,我们使用 LocalDate 表示一个日期,该日期没有一天中的某个时间,也没有时区的上下文或utc的偏移量。
LocalDate
使用日期范围(一对 LocalDate 对象),我建议您将threeten额外库添加到您的项目中,免费且开源。这个图书馆包括 LocalDateRange 同学们,这正是你们需要的。
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.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 类还提供了其他比较方法。
isConnected
(overlaps(other) || abuts(other))
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 ,等等。
java.util.Date
SimpleDateFormat
java.sql.*
Interval
YearWeek
YearQuarter
1条答案
按热度按时间ovfsdjhp1#
tl;博士
避免遗留日期时间类
使用日历对象
从不使用
Calendar
或Date
. 这些可怕的类在几年前被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
类可以让您以这种方式工作。使用LocalDateRange.ofClosed
而不是LocalDateRange.of
.跑步的时候。
邻接=假
重叠=真
使用全封闭方法,两个范围重叠而不是相邻,这与我们在前面的示例代码中看到的相反。
重叠或邻接
注意
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
,等等。