从纳秒获得人类可读时间

Sap*_*aik 4 java time android duration datetime-conversion

我正在尝试实现ETA功能 System.nanoTime()

startTime = System.nanoTime()
Long elapsedTime = System.nanoTime() - startTime;
Long allTimeForDownloading = (elapsedTime * allBytes / downloadedBytes);

Long remainingTime = allTimeForDownloading - elapsedTime;
Run Code Online (Sandbox Code Playgroud)

但我无法想象如何获得纳秒的人类可读形式; 例如:1d 1h,36s3m 50s.

我怎样才能做到这一点?

Got*_*its 6

我会说这两个答案都是正确的,但无论如何这里是一个接受纳米时间并返回人类可读字符串的函数的较短版本.

private String getReadableTime(Long nanos){

    long tempSec = nanos/(1000*1000*1000);
    long sec = tempSec % 60;
    long min = (tempSec /60) % 60;
    long hour = (tempSec /(60*60)) % 24;
    long day = (tempSec / (24*60*60)) % 24;
    return String.format("%dd %dh %dm %ds", day,hour,min,sec);

}
Run Code Online (Sandbox Code Playgroud)

为了获得最大精度,您可以使用浮点除法和舍入来代替整数除法.


小智 2

如果remainingTime纳秒为单位,只需进行数学计算并将值附加到 a StringBuilder

long remainingTime = 5023023402000L;
StringBuilder sb = new StringBuilder();
long seconds = remainingTime / 1000000000;
long days = seconds / (3600 * 24);
append(sb, days, "d");
seconds -= (days * 3600 * 24);
long hours = seconds / 3600;
append(sb, hours, "h");
seconds -= (hours * 3600);
long minutes = seconds / 60;
append(sb, minutes, "m");
seconds -= (minutes * 60);
append(sb, seconds, "s");
long nanos = remainingTime % 1000000000;
append(sb, nanos, "ns");

System.out.println(sb.toString());

// auxiliary method
public void append(StringBuilder sb, long value, String text) {
    if (value > 0) {
        if (sb.length() > 0) {
            sb.append(" ");
        }
        sb.append(value).append(text);
    }
}
Run Code Online (Sandbox Code Playgroud)

上述的输出是:

1h 23m 43s 23402000ns

(1 小时 23 分 43 秒 23402000 纳秒)。