tl;博士
20:11:13 < 01:00:00 < 14:49:00
LocalTime target = LocalTime.parse( "01:00:00" ) ;
Boolean targetInZone = (
target.isAfter( LocalTime.parse( "20:11:13" ) )
&&
target.isBefore( LocalTime.parse( "14:49:00" ) )
) ;
java.time.LocalTime
java.time 类包括仅表示没有日期和时区的一天中的时间。LocalTime
所以我想要的是,20:11:13 < 01:00:00 < 14:49:00。
首先,我们定义边界。您的输入字符串恰好符合标准 ISO 8601 格式。默认情况下,java.time 类使用 ISO 8601 格式,因此无需指定格式设置模式。
LocalTime start = LocalTime.parse( "20:11:13" );
LocalTime stop = LocalTime.parse( "14:49:00" );
并定义我们的测试用例,目标。01:00:00
LocalTime target = LocalTime.parse( "01:00:00" );
现在我们设置了比较这些对象。我们想要查看目标是否在较晚时间之后,但在较早的时间之前。这意味着在这种情况下是半夜,大约在晚上8点到第二天早上3点之间。LocalTime
Boolean isTargetAfterStartAndBeforeStop = ( target.isAfter( start ) && target.isBefore( stop ) ) ;
该测试可以更简单地表示为“不在凌晨3点到晚上8点之间”。然后,我们可以推广到任何一对对象,如果开始时间在停止之前以24小时时钟出现,那么我们测试它们之间,如果开始时间在停止之后,则不在此之间(如本问题所示)。LocalTime
此外,时间跨度通常使用半开式方法处理,其中开头是包容性的,而结尾是排他性的。因此,严格来说,“之间”比较将是“目标等于或晚于开始,目标在停止之前”,或者更简单地说,“目标不是在开始之前和停止之前”。
Boolean isBetweenStartAndStopStrictlySpeaking =
( ( ! target.isBefore( start ) && target.isBefore( stop ) ) ;
如果开始时间是在停止之后,在24小时制内,那么假设我们想要问题中建议的逻辑(在晚上8点之后,但在凌晨3点之前)。
if( start.isAfter( stop ) ) {
return ! isBetweenStartAndStopStrictlySpeaking ;
} else {
return isBetweenStartAndStopStrictlySpeaking ;
}
关于 java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧旧日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 & JPA 2.2 支持 java.time。java.sql.*
从哪里获取 java.time 类?