简而言之
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" );
现在我们已经准备好比较这些
LocalTime
对象。我们想要查看目标时间是否在较晚时间之后,但在较早时间之前。也就是说,在这种情况下是在半夜时分,大约在晚上8点到第二天早上3点之间。
Boolean isTargetAfterStartAndBeforeStop = ( target.isAfter( start ) && target.isBefore( stop ) ) ;
那个测试可以更简单地表述为“在凌晨3点到下午8点之间
不是”。我们可以推广到任何一对
LocalTime
对象,如果开始时间早于结束时间且使用24小时制,则进行
之间的测试,否则进行
不在之间的测试(就像这个问题中的情况)。此外,时间段通常使用半开放方法处理,其中开始时间是
包含的,而结束时间是
排除的。因此,“之间”的比较严格来说应该是“目标是否等于或晚于开始时间并且目标在结束时间之前”,或者更简单地说,“目标
不在开始时间之前且在结束时间之前”。
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驱动程序。无需字符串,无需
java.sql.*
类。Hibernate 5和JPA 2.2支持
java.time。
在哪里获取java.time类?
01:00:00
大于20:11:13
且小于14:49:00
,前提是20:11:13
总是小于14:49:00
。这是给定的先决条件。 - My God01:00:00
不比20:11:13
更大,而20:11:13
永远不会小于14:49:00
。如果您想确定时间是否介于第一天的20:11:13
和第二天的14:49:00
之间,则需要在比较中引入日期。 - jalynn220:11:13
始终小于14:49:00
,这样不是也可以吗? - My God