1. 引言
在Java中,有许多方法可以在不考虑日期的情况下判断特定时间是否位于两个时间之间。
在这篇教程中,我们将探讨实现这一目标的几种可能方式。
2. 使用isAfter()
和isBefore()
方法
Java 8在java.time包中引入了LocalTime
类,提供了方便的方法来处理时间,而不考虑日期:
LocalTime startTime = LocalTime.parse("09:00:00");
LocalTime endTime = LocalTime.parse("17:00:00");
LocalTime targetTime = LocalTime.parse("12:30:00");
这里我们初始化三个LocalTime
变量:startTime
、endTime
和targetTime
,分别设置为具体的时值。这些行基本上为测试方法中的时间比较设置了起始时间、结束时间和目标时间。
LocalTime.parse("09:00:00")
将字符串"09:00:00"解析为表示上午9点的LocalTime
对象。同样地,"17:00:00"代表下午5点,"12:30:00"代表中午12点30分。
现在让我们测试这个方法:
@Test
void givenLocalTime_whenUsingIsAfterIsBefore_thenTimeIsBetween() {
assertTrue(!targetTime.isBefore(startTime) && !targetTime.isAfter(endTime));
}
这个方法使用LocalTime
类的isAfter()
和isBefore()
方法检查给定的targetTime
是否位于指定的startTime
和endTime
之间。我们使用assertTrue()
方法来验证targetTime
既不在startTime
之前也不在endTime
之后。
3. 使用compareTo()
方法
另一种方法是使用compareTo()
方法,它用于比较两个LocalTime
实例:
@Test
void givenLocalTime_whenUsingCompareTo_thenTimeIsBetween() {
assertTrue(targetTime.compareTo(startTime) >= 0 && targetTime.compareTo(endTime) <= 0);
}
这里,表达式targetTime.compareTo(startTime) >= 0 && targetTime.compareTo(endTime) <= 0
使用逻辑与(&&)组合了两个比较。它检查targetTime
是否大于或等于startTime
并且小于或等于endTime
。
这个复合条件确保targetTime
位于由startTime
和endTime
定义的时间范围内(包括边界)。如果两个单独的比较结果均为真,整个表达式的结果为真,表示目标时间在起始时间和结束时间之间,或者与它们相等。
4. 使用after()
和before()
方法
在这个方法中,我们将使用过时的Date
和Calendar
对象来表示和比较时间。尽管这种方式不如现代Java 8的LocalTime
方法方便,但在需要与旧代码库或系统兼容的场景中仍然适用:
@Test
void givenDate_whenUsingAfterBefore_thenTimeIsBetween() {
Calendar startCalendar = Calendar.getInstance();
startCalendar.set(Calendar.HOUR_OF_DAY, 9);
startCalendar.set(Calendar.MINUTE, 0);
Date startTime = startCalendar.getTime();
Calendar endCalendar = Calendar.getInstance();
endCalendar.set(Calendar.HOUR_OF_DAY, 17);
endCalendar.set(Calendar.MINUTE, 0);
Date endTime = endCalendar.getTime();
Calendar targetCalendar = Calendar.getInstance();
targetCalendar.set(Calendar.HOUR_OF_DAY, 12);
targetCalendar.set(Calendar.MINUTE, 30);
Date targetTime = targetCalendar.getTime();
assertTrue(!targetTime.before(startTime) && !targetTime.after(endTime));
}
首先,我们使用Calendar.getInstance()
方法创建startTime
、endTime
和targetTime
的Calendar
实例,这将返回一个初始化为当前日期和时间的Calendar
对象。
一旦Calendar
对象设置好,我们就从各自的Calendar
实例中提取代表开始、结束和目标时间的Date
对象。
有了Date
对象,我们就可以通过使用Date
类的before()
和after()
方法来比较targetTime
与startTime
和endTime
。
5. 总结
总之,Java提供了多种方法,包括现代的LocalTime
方法、过时的Date
功能以及正则表达式,准确地判断特定时间是否落入预定义的范围,以满足各种开发需求。
如往常一样,相关的源代码可以在GitHub上找到。