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

如何计算两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:54:09