如何将毫秒转换为“hh:mm:ss”格式?

2022-08-31 05:55:41

我很困惑。偶然发现线程后,我试图弄清楚如何格式化具有格式的倒数计时器 。hh:mm:ss

这是我的尝试 -

//hh:mm:ss
String.format("%02d:%02d:%02d", 
    TimeUnit.MILLISECONDS.toHours(millis),
    TimeUnit.MILLISECONDS.toMinutes(millis) - 
    TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
    TimeUnit.MILLISECONDS.toSeconds(millis) - 
    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));   

所以,当我尝试像 ,这样的值时,我得到 ,这是错误的,因为它应该是 。显然,我的逻辑有问题,但目前,我看不出它是什么!3600000ms01:59:0001:00:00

任何人都可以帮忙吗?

编辑 -

修复了它。以下是格式化毫秒格式的正确方法 -hh:mm:ss

//hh:mm:ss
String.format("%02d:%02d:%02d", 
    TimeUnit.MILLISECONDS.toHours(millis),
    TimeUnit.MILLISECONDS.toMinutes(millis) - 
    TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
    TimeUnit.MILLISECONDS.toSeconds(millis) - 
    TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))));

问题是这个.它应该是这个相反。TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))


答案 1

真的很接近:

String.format("%02d:%02d:%02d", 
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -  
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), // The change is in this line
TimeUnit.MILLISECONDS.toSeconds(millis) - 
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));   

您使用分钟而不是小时小时转换为毫秒。

顺便说一句,我喜欢你对API的使用:)TimeUnit

下面是一些测试代码:

public static void main(String[] args) throws ParseException {
    long millis = 3600000;
    String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
            TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
            TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
    System.out.println(hms);
}

输出:

01:00:00

我意识到我上面的代码可以通过使用模除法而不是减法来大大简化:

String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
    TimeUnit.MILLISECONDS.toMinutes(millis) % TimeUnit.HOURS.toMinutes(1),
    TimeUnit.MILLISECONDS.toSeconds(millis) % TimeUnit.MINUTES.toSeconds(1));

仍然对所有幻数值使用API,并提供完全相同的输出。TimeUnit


答案 2

通用方法相当简单:

public static String convertSecondsToHMmSs(long seconds) {
    long s = seconds % 60;
    long m = (seconds / 60) % 60;
    long h = (seconds / (60 * 60)) % 24;
    return String.format("%d:%02d:%02d", h,m,s);
}