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

24小时制预约系统时间比较异常求助:12:00判断结果错误

问题根源分析

你遇到的12:00时间比较异常,核心原因是误用了12小时制格式符hh,而非24小时制的HH。

SimpleDateFormat里,hh代表12小时制的小时(范围1-12),所以解析12:00时,它会被默认识别为午夜00:00,而非中午12:00。这直接导致时间比较逻辑错乱——比如11:00(解析为11点)和12:00(解析为0点)对比时,before()会返回true,但在24小时制规则里,12:00明明晚于11:00。

修复方案

方案1:修正SimpleDateFormat格式符

把格式字符串从"hh:mm"改为"HH:mm"(HH是24小时制的小时符,范围0-23),就能正确解析所有24小时制时间:

// 建议复用SimpleDateFormat实例,避免重复创建(它线程不安全,单线程场景可直接用)
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");

String start = (String) startTime.getSelectedItem();
String end = (String) endTime.getSelectedItem();

try {
    Date startDate = timeFormat.parse(start);
    Date endDate = timeFormat.parse(end);
    // 业务逻辑:禁止结束时间早于开始时间,所以判断"结束时间不早于开始时间"才有效
    if (!endDate.before(startDate)) {
        System.out.println("预约时间有效");
    } else {
        System.out.println("错误:结束时间不能早于开始时间");
    }
} catch (ParseException e) {
    e.printStackTrace();
    System.out.println("时间格式解析错误");
}

方案2:使用Java 8+的LocalTime(推荐)

SimpleDateFormat是老旧且线程不安全的类,Java 8及以上版本更推荐用java.time包的时间API,代码更简洁安全:

String start = (String) startTime.getSelectedItem();
String end = (String) endTime.getSelectedItem();

try {
    LocalTime startTime = LocalTime.parse(start);
    LocalTime endTime = LocalTime.parse(end);
    // 同样按业务需求判断:禁止结束早于开始,所以只要endTime不早于startTime就有效
    if (!endTime.isBefore(startTime)) {
        System.out.println("预约时间有效");
    } else {
        System.out.println("错误:结束时间不能早于开始时间");
    }
} catch (DateTimeParseException e) {
    e.printStackTrace();
    System.out.println("时间格式解析错误");
}

LocalTime默认支持HH:mm格式解析,无需手动指定格式,还避免了线程安全问题,是更现代的写法。

验证场景测试
  • 测试1:开始11:00,结束12:00 → 有效(返回符合预期的结果)
  • 测试2:开始12:00,结束11:00 → 无效(正确拦截错误预约)
  • 测试3:开始23:00,结束00:00 → 会被判定为无效(因为00:00在当天早于23:00),如果你的系统支持跨天预约,需要额外处理日期逻辑,但根据你的需求描述,这个结果符合当天预约的校验规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:43:17