如何以这种格式转换秒数“HH:mm:ss”

时间:2012-02-09 16:30:09

标签: java android time

我想以这种格式转换第二个/毫秒“HH:mm:ss”(对于例如,从5秒到00:00:05)。我试图以这种方式获得这种格式:

int millis = 5000;
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
String time = df.format(millis);

这样,我得到“01:00:05”而不是“00:00:05”。我哪里错了?

6 个答案:

答案 0 :(得分:20)

时区。

长值5000表示在纪元后5秒。对于大多数时区,在纪元后5秒不是当地时间午夜过后5秒。

Java 8更新

java.time.LocalTime将处理挂钟“时间”的想法,而不必担心java.util.Date中隐含的时区和日期。如果您可以使用Java 8,并且您的持续时间总是少于一天,那么您的示例的正确版本可以简单如下:

int millis = 5000;
int seconds = millis / 1000; // Maybe no need to divide if the input is in seconds
LocalTime timeOfDay = LocalTime.ofSecondOfDay(seconds);
String time = timeOfDay.toString();

(我猜严格来说,java.time.Duration是你想要的更好的模型,因为它代表了一定的秒数,而不是一天的时间。但是格式化为hh:mm:ss是一件痛苦的事情,所以如果你总是处理24小时以下的值,TimeOfDay会免费为你提供这种格式,并且是等价的。)


如果您遇到Java 7或更低版​​本,那么在示例代码中明确指定GMT的时区应该会为您提供所期望的输出。

这是一个Scala REPL会话,在我的机器上演示了问题和Java 7解决方案:

scala> val millis = 5000
millis: Int = 5000

scala> val df = new java.text.SimpleDateFormat("HH:mm:ss")
df: java.text.SimpleDateFormat = java.text.SimpleDateFormat@8140d380

scala> df.format(millis)
res0: java.lang.String = 01:00:05

scala> df.getTimeZone.getID
res1: java.lang.String = GB

scala> df.getTimeZone.getOffset(millis)
res2: Int = 3600000

scala> df.setTimeZone(java.util.TimeZone.getTimeZone("GMT"))

scala> df.format(millis)
res3: java.lang.String = 00:00:05

因此,您可以看到我的默认时区为GB,与5000L表示的时间相距GMT 1小时。将时区设置为GMT会产生00:00:05的预期输出。

答案 1 :(得分:12)

我让这个工作。请让我知道这对你有没有用。看起来好像做了很多看似简单的事情。

    int millis = 5000;
    TimeZone tz = TimeZone.getTimeZone("UTC");
    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
    df.setTimeZone(tz);
    String time = df.format(new Date(millis));
    System.out.println(time);

答案 2 :(得分:5)

你应该使用Locale参数获得SimpleDateFormat。

public static String getDateFromMillis(long millis) {
    SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
    return formatter.format(new Date(millis));
}

答案 3 :(得分:5)

我为此任务编写了一个简单的实用程序函数,它不需要任何Java版本,也不会实例化任何不必要的对象:

/**
 * provides a String representation of the given time
 * @return {@code millis} in hh:mm:ss format
 */
public static final String formatTime(long millis) {
    long secs = millis / 1000;
    return String.format("%02d:%02d:%02d", secs / 3600, (secs % 3600) / 60, secs % 60);
}

与此处的其他解决方案不同,这甚至可以处理长达100小时

答案 4 :(得分:1)

public class HHMMSS {

        final int UUR = 3600;
        final int MINUUT = 60;

    public void converteerTijd() {

        int uren, minuten, seconden, ingave;
        System.out.print("Geef een aantal seconden: ");
        ingave = Input.readInt();
        uren = ingave / UUR;
        minuten = (ingave - uren * UUR) / MINUUT;
        seconden = ingave - uren * UUR - minuten * MINUUT;
        String nU1 = (uren < 10) ? "0" : "";
        String nM1 = (minuten < 10) ? "0" : "";
        String nS1 = (seconden < 10) ? "0" : "";
        System.out.println(nU1 + uren + "-" + nM1 + minuten + "-" + nS1 + seconden);

答案 5 :(得分:1)

Java 9回答:

    Duration dur = Duration.ofMillis(millis);
    System.out.println(String.format("%02d:%02d:%02d",
                       dur.toHours(), dur.toMinutesPart(), dur.toSecondsPart()));

(尚未测试)

the API docs for Java 9中描述了toXxPart种方法。