如何在 hh:mm:ss 中格式化已用的时间间隔。Java 中的 SSS 格式?对您要执行的操作的支持内置到最新的JDK中,其中包含一个名为 的鲜为人知的类。TimeUnit

2022-09-01 02:44:51

我正在制作一个秒表,我使用Java的SimpleDateFormat将毫秒数转换为漂亮的“hh:mm:ss:SSS”格式。问题是小时字段总是有一些随机数。以下是我正在使用的代码:

public static String formatTime(long millis) {
    SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss.SSS");

    String strDate = sdf.format(millis);
    return strDate;
}

如果我取下hh部分,那么它工作正常。否则,在hh部分中,即使传入的参数(毫秒数)为零,它也将显示类似“07”的随机内容。

不过,我对SimpleDateFormat类知之甚少。感谢您的任何帮助。


答案 1

对您要执行的操作的支持内置到最新的JDK中,其中包含一个名为 的鲜为人知的类。TimeUnit

您要使用的是 java.util.concurrent.TimeUnit 来处理间隔

SimpleDateFormat它只做它听起来像它所做的事情,它格式化的实例,或者在你的情况下,它将值转换为a的上下文,它不知道如何处理间隔,这显然是你正在使用的。java.util.Datelongjava.util.Date

您可以轻松地执行此操作,而无需诉诸于像JodaTime这样的外部库。

import java.util.concurrent.TimeUnit;

public class Main
{        
    private static String formatInterval(final long l)
    {
        final long hr = TimeUnit.MILLISECONDS.toHours(l);
        final long min = TimeUnit.MILLISECONDS.toMinutes(l - TimeUnit.HOURS.toMillis(hr));
        final long sec = TimeUnit.MILLISECONDS.toSeconds(l - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min));
        final long ms = TimeUnit.MILLISECONDS.toMillis(l - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min) - TimeUnit.SECONDS.toMillis(sec));
        return String.format("%02d:%02d:%02d.%03d", hr, min, sec, ms);
    }

    public static void main(final String[] args)
    {
        System.out.println(formatInterval(Long.parseLong(args[0])));
    }
}

输出的格式将如下所示

13:00:00.000

答案 2

一种较短的方法是在Apache Commons Lang中使用SefetyFormatUtils类:

public static String formatTime(long millis) {
    return DurationFormatUtils.formatDuration(millis, "HH:mm:ss.S");
}

推荐