使用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.
相关产品推荐
相关产品推荐

