檢查給定時間是否位於兩個時間之間(無論日期如何)
一、簡介
在 Java 中,有多種方法可以在不考慮日期的情況下確定特定時間是否在兩個時間之內。
在本教程中,我們將研究實現此目標的幾種可能方法。
2. 使用isAfter()
和isBefore()
方法
Java 8 在[j ava.time](https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html)
套件中引入了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:00
LocalTime
物件。同樣,「 17:00:00
」代表下午5:00
,「 12:30:00
」代表下午12:30
。
現在讓我們測試一下這種方法:
@Test
void givenLocalTime_whenUsingIsAfterIsBefore_thenTimeIsBetween() {
assertTrue(!targetTime.isBefore(startTime) && !targetTime.isAfter(endTime));
}
此方法使用LocalTime
類別的isAfter
() 和isBefore()
方法測試給定的targetTime
是否介於指定的startTime
和endTime
之間。我們使用assetTrue()
方法來驗證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
使用邏輯 AND (&&) 組合兩個比較。它檢查targetTime
是否大於或等於startTime
且小於或等於endTime
。
此複合條件確保targetTime
落在startTime
和endTime
定義的時間範圍內(含)。如果兩個單獨的比較的計算結果都為 true,則整個表達式的計算結果為 true,表示目標時間位於開始時間和結束時間之間,或與它們一致。
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
物件後,我們將targetTime
與startTime
和endTime
進行比較。我們透過利用Date
類別的before()
和after()
方法來實現這一點。
5. 結論
總之,Java 提供了多種方法,包括現代LocalTime
方法、遺留Date
功能和正規表示式,來準確地確定特定時間是否在定義的邊界內,從而滿足不同的開發需求。
與往常一樣,隨附的源代碼可以 在 GitHub 上找到。