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变量:startTimeendTimetargetTime,分别设置为具体的时值。这些行基本上为测试方法中的时间比较设置了起始时间、结束时间和目标时间。

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是否位于指定的startTimeendTime之间。我们使用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位于由startTimeendTime定义的时间范围内(包括边界)。如果两个单独的比较结果均为真,整个表达式的结果为真,表示目标时间在起始时间和结束时间之间,或者与它们相等。

4. 使用after()before()方法

在这个方法中,我们将使用过时的DateCalendar对象来表示和比较时间。尽管这种方式不如现代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()方法创建startTimeendTimetargetTimeCalendar实例,这将返回一个初始化为当前日期和时间的Calendar对象。

一旦Calendar对象设置好,我们就从各自的Calendar实例中提取代表开始、结束和目标时间的Date对象。

有了Date对象,我们就可以通过使用Date类的before()after()方法来比较targetTimestartTimeendTime

5. 总结

总之,Java提供了多种方法,包括现代的LocalTime方法、过时的Date功能以及正则表达式,准确地判断特定时间是否落入预定义的范围,以满足各种开发需求。

如往常一样,相关的源代码可以在GitHub上找到。