使用Calendar类从Date对象中减去分钟时出现计算错误
解决Calendar减分钟导致时间异常的问题
你的问题大概率是两个原因之一:要么是误用了12小时制的Calendar.HOUR字段,要么是intervalMinutes变量的值不符合预期,另外Calendar类本身的设计缺陷也容易引发这类问题。
问题分析
你提到选中15:47仅减1分钟得到16:59,这个结果相当于在原时间上加了72分钟,说明calendar.add(Calendar.MINUTE, -(this.intervalMinutes))实际执行的是加操作——要么是intervalMinutes本身是负数(比如-72),要么是代码逻辑中对该变量的赋值有误。
另外,你当前用的Calendar.HOUR是12小时制字段,虽然减小时时看似正常,但如果后续涉及跨AM/PM的时间计算,必然会引发其他问题。
修复方案
1. 检查intervalMinutes变量的值
先打印this.intervalMinutes的实际值,确认用户选择减1分钟时,该变量是否确实为1。如果值异常,排查前端输入或变量赋值的逻辑。
2. 替换为24小时制字段
将Calendar.HOUR改为Calendar.HOUR_OF_DAY,避免12小时制的混淆:
Calendar calendar = Calendar.getInstance(); calendar.setTime(this.realAlarmTime); // 使用HOUR_OF_DAY(24小时制)替代HOUR(12小时制) calendar.add(Calendar.HOUR_OF_DAY, -(this.intervalHours)); calendar.add(Calendar.MINUTE, -(this.intervalMinutes)); this.realAlarmTime = calendar.getTime();
3. 推荐迁移到Java 8+的java.time API
Calendar类设计老旧且容易出错,Java 8引入的java.time包(JSR-310)是更可靠的替代方案,代码逻辑更清晰:
// 将Date转换为LocalDateTime(基于系统默认时区) LocalDateTime alarmDateTime = this.realAlarmTime.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); // 减去指定时长 alarmDateTime = alarmDateTime.minusHours(this.intervalHours) .minusMinutes(this.intervalMinutes); // 转换回Date类型 this.realAlarmTime = Date.from(alarmDateTime.atZone(ZoneId.systemDefault()).toInstant());
内容的提问来源于stack exchange,提问作者Binyamin Pekar
相关产品推荐
相关产品推荐

