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

使用SimpleDateFormat格式化毫秒时长时输出多出2小时的问题求助

问题原因

  • 你用到的SimpleDateFormat是时间点格式化工具,本身不支持时长格式化:你传入的毫秒值12728918会被它识别为UTC时区下1970-01-01 00:00:00之后经过的毫秒数,对应的UTC标准时间点是1970-01-01 03:32:08。
  • SimpleDateFormat默认会读取设备本地时区做自动转换:如果你的设备时区是UTC+2(比如欧洲中部夏令时),就会把上述UTC时间点加2小时转换为本地时间,最终输出05:32:08,和你预期的时长刚好差2小时。

修复方案

方案1:手动换算时长(兼容性最好,无API版本限制)

直接对毫秒值做单位拆分,再格式化输出,是最稳妥的方案:

val leftTimeInMillis = 12728918
val totalSeconds = leftTimeInMillis / 1000
val hours = totalSeconds / 3600
val minutes = (totalSeconds % 3600) / 60
val seconds = totalSeconds % 60
// 补前导0格式化
binding.textTimeLeft.text = String.format(Locale.ROOT, "%02d:%02d:%02d", hours, minutes, seconds)

方案2:强制SimpleDateFormat使用UTC时区(临时应急方案,不推荐长期使用)

本质是取巧规避时区转换问题,适合快速修复线上问题:

val leftTimeInMillis = 12728918
val mTimeFormat = SimpleDateFormat("HH:mm:ss", Locale.ROOT)
mTimeFormat.timeZone = TimeZone.getTimeZone("UTC") // 强制使用UTC时区,屏蔽本地时区影响
binding.textTimeLeft.text = mTimeFormat.format(leftTimeInMillis)

方案3:使用官方时长处理API(API 26及以上支持)

如果应用最低支持API 26,可以用Duration类更规范地处理时长逻辑:

val leftTimeInMillis = 12728918
val duration = Duration.ofMillis(leftTimeInMillis)
val hours = duration.toHours()
val minutes = duration.toMinutesPart()
val seconds = duration.toSecondsPart()
binding.textTimeLeft.text = String.format(Locale.ROOT, "%02d:%02d:%02d", hours, minutes, seconds)

内容的提问来源于stack exchange,提问作者Ahmet B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 02:12:00