業務系統中常需驗證用戶輸入的時間區間(如「09:00-11:00」)是否合法、是否落在允許範圍內。本文演示基於 SimpleDateFormat 解析與時間戳比較的輕量級驗證方案。
- 分割字符串得起止時間SimpleDateFormat("HH:mm") 解析為 Date,取 getTime() 獲取毫秒時間戳import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TimeRangeValidator {
public static void main(String[] args) {
// 允許的操作區間
String[] zone1 = "08:30-11:00".split("-");
String[] zone2 = "13:00-17:00".split("-");
// 待驗證的高峰期區間
String[] actZone = "09:00-11:00".split("-");
DateFormat df = new SimpleDateFormat("HH:mm"); // 注意:24 小制用 HH
try {
long minTime = df.parse("00:00").getTime();
long maxTime = df.parse("24:00").getTime(); // 邊界值
long[] t1 = {df.parse(zone1[0]).getTime(), df.parse(zone1[1]).getTime()};
long[] t2 = {df.parse(zone2[0]).getTime(), df.parse(zone2[1]).getTime()};
long[] act = {df.parse(actZone[0]).getTime(), df.parse(actZone[1]).getTime()};
// 1. 校驗允許區間自身合法性
validateRange("操作區間一", t1, minTime, maxTime);
validateRange("操作區間二", t2, minTime, maxTime);
validateRange("高峰期區間", act, minTime, maxTime);
// 2. 判斷高峰期是否落在任一允許區間內
boolean legal = contains(t1, act) || contains(t2, act);
System.out.println(legal ? "info: 高峰期區間合法" : "warn: 高峰期區間不合法");
} catch (Exception e) {
e.printStackTrace();
}
}
/** 校驗單個區間合法性 */
private static void validateRange(String name, long[] range, long min, long max) {
if (range[0] >= range[1] || range[0] < min || range[1] > max) {
System.out.println(name + " 不合法");
}
}
/** 判斷 outer 是否完全包含 inner */
private static boolean contains(long[] outer, long[] inner) {
return inner[0] >= outer[0] && inner[1] <= outer[1];
}
}
HH:mm vs hh:mmHH:24 小制 (0-23) —— 推薦hh:12 小制 (1-12) 需配合 a (AM/PM),易產生歧義24:00 在 SimpleDateFormat 中會被解析為第二天 00:00,作為上邊界判斷時需注意邏輯(示例用 > maxTime 排除等於情況)。
SimpleDateFormat 非線程安全,多線程環境下請用 ThreadLocal 或 Java 8+ DateTimeFormatter。
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("HH:mm");
LocalTime start = LocalTime.parse("09:00", fmt);
LocalTime end = LocalTime.parse("11:00", fmt);
// 直接比較:start.isBefore(end) 等,無需時間戳轉換
時間區間驗證看似簡單,邊界條件、時區、線程安全卻暗藏坑點。掌握標準庫與現代 API 兩套方案,才能寫出健壯可維護的代碼。