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
相关产品推荐
相关产品推荐

