SimpleDateFormat显示异常:短时长自动填充5:30问题求助
解决媒体播放时长格式化时的错误显示问题
我来帮你搞定这个问题!你遇到的核心问题是用错了工具:SimpleDateFormat是用来格式化具体日期时间的(比如2024-05-20 14:30:00这种),而不是用来处理**播放时长(时间间隔)**的。
当你把currentPosition(毫秒数)传给Date构造函数时,它会把这个数值当成「从1970年1月1日00:00:00 GMT开始的时间戳」,然后根据你的本地时区解析成日期时间——你看到的5:30其实是你的时区和GMT的偏移值,完全不是你要的播放时长。
解决方案1:手动计算时长(兼容所有Java版本)
直接把毫秒数转换成分钟和秒,然后用String.format确保两位数显示:
// 处理当前播放位置 int currentTotalSeconds = mediaPlayer.getCurrentPosition() / 1000; int currentMinutes = currentTotalSeconds / 60; int currentSeconds = currentTotalSeconds % 60; leftTime.setText(String.format("%02d:%02d", currentMinutes, currentSeconds)); // 处理剩余时长 int remainingTotalSeconds = (mediaPlayer.getDuration() - mediaPlayer.getCurrentPosition()) / 1000; int remainingMinutes = remainingTotalSeconds / 60; int remainingSeconds = remainingTotalSeconds % 60; rightTime.setText(String.format("%02d:%02d", remainingMinutes, remainingSeconds));
这里的%02d会自动给不足两位的数字补0,比如5秒会显示成00:05,45秒显示成00:45,完全符合你的需求。
解决方案2:用Java 8+的Duration类(更优雅)
如果你的项目用的是Java 8或更高版本,推荐用Duration类专门处理时间间隔,代码更清晰:
// 当前播放时长 Duration currentDuration = Duration.ofMillis(mediaPlayer.getCurrentPosition()); long currentMin = currentDuration.toMinutes(); long currentSec = currentDuration.minusMinutes(currentMin).getSeconds(); leftTime.setText(String.format("%02d:%02d", currentMin, currentSec)); // 剩余时长 Duration remainingDuration = Duration.ofMillis(mediaPlayer.getDuration() - mediaPlayer.getCurrentPosition()); long remainingMin = remainingDuration.toMinutes(); long remainingSec = remainingDuration.minusMinutes(remainingMin).getSeconds(); rightTime.setText(String.format("%02d:%02d", remainingMin, remainingSec));
Duration是Java官方为时间间隔设计的类,完全不会有日期时区的干扰,代码可读性更强。
总结
别再用SimpleDateFormat处理播放时长啦,它的设计目标和你的需求完全不匹配。上面两种方法都能完美解决你遇到的「分钟位显示30、小时位显示5」的问题,确保时长不足1分钟时显示00:xx。
内容的提问来源于stack exchange,提问作者RahulSingh
相关产品推荐
相关产品推荐

