如何计算两个Calendar实例的时间差 及24小时格式转12小时格式方法
解决方案
首先澄清核心误区:Calendar 实例本身没有「12小时/24小时格式的存储属性,你看到的格式差异只是toString()方法的展示逻辑,本质问题是你设置时间时用的字段不统一导致的数值错误,不需要做格式转换,只要统一字段用法,直接计算毫秒差即可。
现有代码问题说明
- 你第一段代码中写的
Calendar.HOUR+1实际对应常量Calendar.HOUR_OF_DAY(Calendar.HOUR常量值为10,加1刚好对应24小时制小时字段),所以你给calendar1设置的是24小时制的小时值 - 第二段代码你用的是
Calendar.HOUR,这个是12小时制专用字段,取值范围0-11,只会返回上午/下午周期内的12小时数值,所以你设置的时间本身就存在误差,不是格式问题。
正确实现步骤
1. 统一用相同字段设置时间,保证时间数值准确
建议统一使用24小时制字段Calendar.HOUR_OF_DAY设置时间,避免字段写法更易读且不会出现上午/下午的数值偏差:
// 第一个Calendar正确写法 val calendar1 = Calendar.getInstance() calendar1[Calendar.HOUR_OF_DAY] = hour.toString().toInt() calendar1[Calendar.MINUTE] = minute.toString().toInt() // 可选操作:秒和毫秒置0,避免当前时间默认带的秒数、毫秒数影响差值精度 calendar1[Calendar.SECOND] = 0 calendar1[Calendar.MILLISECOND] = 0 // 当前时间Calendar正确写法 val calendar = Calendar.getInstance() // 原有重复赋值的代码可直接删除,没有实际作用 // 同样可以按需置秒和毫秒为0 calendar[Calendar.SECOND] = 0 calendar[Calendar.MILLISECOND] = 0
2. 直接计算时间差
取两个Calendar的时间戳毫秒值相减,即可得到准确差值,再换算为你需要的时分秒单位:
// 时间差毫秒数,结果为正表示当前时间更晚,为负表示calendar1时间更晚 val diffMills = calendar.timeInMillis - calendar1.timeInMillis // 换算为小时、分钟、秒单位 val diffHours = diffMills / (1000 * 60 * 60) val diffMinutes = (diffMills % (1000 * 60 * 60)) / (1000 * 60) val diffSeconds = (diffMills % (1000 * 60)) / 1000
可选:12小时制格式展示
如果需要输出12小时制的字符串展示,使用格式化输出即可,不会影响内部时间值的计算:
val sdf = SimpleDateFormat("yyyy-MM-dd hh:mm:ss a", Locale.getDefault()) val time12Str = sdf.format(calendar.time)
内容的提问来源于stack exchange,提问作者IRON MAN
相关产品推荐
相关产品推荐

