Java中12小时制时间递增异常问题求助
问题分析与解决
问题根源
你的代码核心问题出在SimpleDateFormat的模式选择上:用了HH:mm a,其中HH是24小时制的小时格式,但你同时搭配了12小时制的AM/PM标识a,这种混用直接导致解析和格式化逻辑混乱:
- 解析
12:59 PM时,HH会把12当作24小时制的12点,加1分钟后变成13点,格式化时直接输出24小时制的13,再带上PM,就出现了13:00 PM的错误; - 解析
01:00 PM时,HH把01识别为24小时制的凌晨1点,虽然时间数值加1分钟后是01:01,但原时间的PM标识没有被正确解析到Calendar的AM/PM字段里,最终格式化输出成了01:01 AM。
修复方案(基于旧API)
把模式中的HH改成hh(12小时制小时格式),让它和a正确配合,就能处理12小时制的时间逻辑:
private String getNextTime(String time) { final int INTERVAL = 1; // 用hh表示12小时制小时,配合a识别AM/PM SimpleDateFormat df = new SimpleDateFormat("hh:mm a", Locale.US); Date d = null; try { d = df.parse(time); } catch (ParseException e) { System.out.println("Bad tee time: " + time); System.exit(-1); } Calendar cal = Calendar.getInstance(); cal.setTime(d); cal.add(Calendar.MINUTE, INTERVAL); String outTime = df.format(cal.getTime()); return outTime; }
测试验证结果:
- 输入
12:59 PM→ 输出01:00 PM(符合预期) - 输入
01:00 PM→ 输出01:01 PM(符合预期) - 输入
11:59 AM→ 输出12:00 PM(符合预期)
推荐方案(Java 8+ 新时间API)
SimpleDateFormat和Calendar是线程不安全的过时API,Java 8之后推荐用java.time包下的类,代码更简洁、安全:
import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.Locale; private String getNextTime(String time) { final int INTERVAL = 1; // 定义12小时制格式化器 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a", Locale.US); // 解析时间 LocalTime localTime = LocalTime.parse(time, formatter); // 增加1分钟 LocalTime nextTime = localTime.plusMinutes(INTERVAL); // 格式化输出 return nextTime.format(formatter); }
这个方案无需手动处理复杂的时间字段,输入格式错误时会抛出DateTimeParseException,按需捕获即可,而且天生线程安全,逻辑更清晰。
内容的提问来源于stack exchange,提问作者todivefor
相关产品推荐
相关产品推荐

