You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Spring的Java预约系统:预约时段有效性判断方案需求

基于Spring的Java预约系统时段冲突校验方案

这是个很常见的时间区间冲突问题,结合你的需求,我整理了一套可直接落地的实现方案,完美适配你的Spring预约系统:

核心思路

把每个预约都转化为时间区间来处理:

  • 已预约记录的区间:[已预约开始时间, 已预约开始时间 + REQUEST_PERIOD]
  • 新预约的区间:[新预约开始时间, 新预约开始时间 + REQUEST_PERIOD]

判断逻辑很清晰:只要新预约的区间和任意一个已预约区间存在重叠,就拒绝预约;反之则接受。

这里的关键是用反向逻辑判断更简单:两个区间不重叠的条件是「新预约结束时间 ≤ 已预约开始时间」OR「新预约开始时间 ≥ 已预约结束时间」。如果不满足这个条件,就说明区间重叠了。

分步实现

1. 统一时间格式与常量定义

首先把分散的年、月、日、时、分转换成Java的LocalDateTime(JDK8+推荐的线程安全时间API),同时定义固定的预约时长常量:

import java.time.LocalDateTime;

// 全局常量,可放在配置类或者常量类中
public class AppointmentConstants {
    public static final int REQUEST_PERIOD = 100; // 单位:分钟
}

// 预约请求实体类(可根据实际需求调整字段)
public class AppointmentRequest {
    private Integer year;
    private Integer month;
    private Integer day;
    private Integer hour;
    private Integer minute;

    // 转换为LocalDateTime的工具方法
    public LocalDateTime toLocalDateTime() {
        return LocalDateTime.of(year, month, day, hour, minute);
    }

    // getter、setter方法省略
}

2. 核心冲突校验方法

在Spring Service层实现校验逻辑,遍历所有已预约记录,逐一判断区间是否重叠:

import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;

@Service
public class AppointmentService {

    // 模拟从数据库获取已预约记录的方法(实际项目替换为DAO查询)
    private List<AppointmentRequest> getExistingAppointments() {
        return List.of(
            new AppointmentRequest(2018, 5, 1, 12, 40),
            new AppointmentRequest(2018, 5, 1, 15, 30)
        );
    }

    // 判断新预约是否有效
    public boolean isAppointmentValid(AppointmentRequest newRequest) {
        LocalDateTime newStart = newRequest.toLocalDateTime();
        LocalDateTime newEnd = newStart.plusMinutes(AppointmentConstants.REQUEST_PERIOD);

        List<AppointmentRequest> existingRequests = getExistingAppointments();
        for (AppointmentRequest existing : existingRequests) {
            LocalDateTime existingStart = existing.toLocalDateTime();
            LocalDateTime existingEnd = existingStart.plusMinutes(AppointmentConstants.REQUEST_PERIOD);

            // 判断区间是否重叠:只要不满足"不重叠"的两个条件,就说明重叠
            boolean isOverlap = !(newEnd.isBefore(existingStart) || newStart.isAfter(existingEnd));
            if (isOverlap) {
                return false; // 存在重叠,直接返回无效
            }
        }
        return true; // 无任何重叠,返回有效
    }
}

3. 结合示例验证

用你给出的测试场景验证:

  • REQUEST_PERIOD=100分钟
  • 已预约requestB的区间:2018-05-01 15:30 → 2018-05-01 17:10
    • requestD(15:40开始)的区间是15:40 → 17:20,和requestB的区间重叠 → 无效
    • requestF/T(15:50开始)的区间是15:50 → 17:30,和requestB的区间重叠 → 无效
  • requestC(18:20开始)的区间是18:20 → 20:00,和所有已预约区间无重叠 → 有效

额外优化建议

  • 时区统一:所有时间处理要使用同一个时区(比如UTC或业务所在时区),避免时区差异导致的计算错误
  • 数据库优化:如果已预约记录量大,直接遍历效率低,可以在数据库层面加时间范围查询,先过滤掉不可能重叠的记录(比如查询结束时间 > 新预约开始时间的记录),再做内存校验
  • 参数前置校验:提前校验新预约的时间格式合法性(比如月份1-12、日期1-31等),避免转换LocalDateTime时抛出异常

内容的提问来源于stack exchange,提问作者Mahmood Mousa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:15:39