在Java中打印时差的最惯用方式?

2022-09-03 04:55:16

我熟悉以毫秒为单位的打印时差:

 long time = System.currentTimeMillis();
 //do something that takes some time...
 long completedIn = System.currentTimeMillis() - time;

但是,有没有一种很好的方法可以使用Apache Commons甚至可怕的平台API的Date/Time对象以指定的格式(例如:HH:MM:SS)打印完整的时间?换句话说,在Java中编写从毫秒派生的时间格式的最短,最简单,最没有废话的方法是什么?


答案 1

Apache Commons具有SefetyFormatUtils类,用于将指定的格式应用于持续时间。所以,像这样:

long time = System.currentTimeMillis();
//do something that takes some time...
long completedIn = System.currentTimeMillis() - time;

DurationFormatUtils.formatDuration(completedIn, "HH:mm:ss:SS");

答案 2

为此目的设计的库是更好的方法,但是具有权利的SimpleDateFormat可能足以满足不到一天的期限。较长的时期需要特别对待这一天。TimeZone

import java.text.DateFormat;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

public class Elapsed {

    private static final long MS_DAY = 24 * 60 * 60 * 1000;
    private final DateFormat df = new SimpleDateFormat("HH : mm : ss : S");

    public Elapsed() {
        df.setTimeZone(TimeZone.getTimeZone("GMT"));
    }

    private String format(long elapsed) {
        long day = elapsed / MS_DAY;
        StringBuilder sb = new StringBuilder();
        sb.append(day);
        sb.append(" : ");
        sb.append(df.format(new Date(elapsed)));
        return sb.toString();
    }

    public static void main(String[] args) {
        Elapsed e = new Elapsed();
        for (long t = 0; t < 3 * MS_DAY; t += MS_DAY / 2) {
            System.out.println(e.format(t));
        }
    }
}

控制台输出:

0 : 00 : 00 : 00 : 0
0 : 12 : 00 : 00 : 0
1 : 00 : 00 : 00 : 0
1 : 12 : 00 : 00 : 0
2 : 00 : 00 : 00 : 0
2 : 12 : 00 : 00 : 0