首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 時間區間合法性驗證:字符串解析與邏輯判斷實戰

     編輯:Java 程式設計入門

業務系統中常需驗證用戶輸入的時間區間(如「09:00-11:00」)是否合法、是否落在允許範圍內。本文演示基於 SimpleDateFormat 解析與時間戳比較的輕量級驗證方案。

核心邏輯

  1. 以 - 分割字符串得起止時間
  2. SimpleDateFormat("HH:mm") 解析為 Date,取 getTime() 獲取毫秒時間戳
  3. 驗證:起始 < 結束、均在 00:00~24:00 範圍內
  4. 判斷目標區間是否被允許區間完全包含

完整代碼示例

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];
    }
}

關鍵細節與避坑指南

1. 日期格式模式:HH:mm vs hh:mm

  • HH:24 小制 (0-23) —— 推薦
  • hh:12 小制 (1-12) 需配合 a (AM/PM),易產生歧義

2. 邊界值處理

24:00 在 SimpleDateFormat 中會被解析為第二天 00:00,作為上邊界判斷時需注意邏輯(示例用 > maxTime 排除等於情況)。

3. 線程安全

SimpleDateFormat 非線程安全,多線程環境下請用 ThreadLocal 或 Java 8+ DateTimeFormatter。

4. 現代化替代方案(Java 8+)

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 限流:按時間段區分配額

時間區間驗證看似簡單,邊界條件、時區、線程安全卻暗藏坑點。掌握標準庫與現代 API 兩套方案,才能寫出健壯可維護的代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved