我正在尝试使用System.nanoTime()
startTime = System.nanoTime()
Long elapsedTime = System.nanoTime() - startTime;
Long allTimeForDownloading = (elapsedTime * allBytes / downloadedBytes);
Long remainingTime = allTimeForDownloading - elapsedTime;
但我无法想象如何获得纳秒的人类可读形式;例如:1d 1h
,36s
和3m 50s
。
我该怎么做?
答案 0 :(得分: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);
}
为了获得最大精度,您可以使用浮点除法和舍入来代替整数除法。
答案 1 :(得分:2)
这是我的旧代码,您也可以将其转换为天数。
private String calculateDifference(long timeInMillis) {
String hr = "";
String mn = "";
long seconds = (int) ((timeInMillis) % 60);
long minutes = (int) ((timeInMillis / (60)) % 60);
long hours = (int) ((timeInMillis / (60 * 60)) % 24);
if (hours < 10) {
hr = "0" + hours;
}
if (minutes < 10) {
mn = "0" + minutes;
}
textView.setText(Html.fromHtml("<i><small;text-align: justify;><font color=\"#000\">" + "Total shift time: " + "</font></small; text-align: justify;></i>" + "<font color=\"#47a842\">" + hr + "h " + mn + "m " + seconds + "s" + "</font>"));
return hours + ":" + minutes + ":" + seconds;
}
}
答案 2 :(得分:2)
如果remainingTime
处于纳秒,只需进行数学运算并将值附加到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);
}
}
以上的输出是:
1h 23m 43s 23402000ns
(1小时23分43秒和23402000纳秒)。
答案 3 :(得分:1)
这是我的建议。它基于以下事实:TimeUnit.values()
中的单位是从最小(纳秒)到最长(天)排序的。
private static String getHumanReadableTime(long nanos) {
TimeUnit unitToPrint = null;
String result = "";
long rest = nanos;
for(TimeUnit t: TimeUnit.values()) {
if (unitToPrint == null) {
unitToPrint = t;
continue;
}
// convert 1 of "t" to "unitToPrint", to get the conversion factor
long factor = unitToPrint.convert(1, t);
long value = rest % factor;
rest /= factor;
result = value + " " + unitToPrint + " " + result;
unitToPrint = t;
if (rest == 0) {
break;
}
}
if (rest != 0) {
result = rest + " " + unitToPrint + " " + result;
}
return result.trim();
}
getHumanReadableTime(139543185092L)
的输出将为
2 MINUTES 19 SECONDS 543 MILLISECONDS 185 MICROSECONDS 92 NANOSECONDS
答案 4 :(得分:1)
您可以使用 java.time.Duration
,它以 ISO-8601 standards 为模型,并作为 JSR-310 implementation 的一部分与 Java-8 一起引入。 Java-9 引入了一些更方便的方法。
演示:
import java.time.Duration;
public class Main {
public static void main(String[] args) {
long elapsedTime = 12345678987654321L;
Duration duration = Duration.ofNanos(elapsedTime);
// Default format
System.out.println(duration);
// Custom format
// ####################################Java-8####################################
String formattedElapsedTime = String.format(
"%02d Day %02d Hour %02d Minute %02d Second %d Millisecond %d Nanosecond", duration.toDays(),
duration.toHours() % 24, duration.toMinutes() % 60, duration.toSeconds() % 60,
duration.toMillis() % 1000, duration.toNanos() % 1000000000L);
System.out.println(formattedElapsedTime);
// ##############################################################################
// ####################################Java-9####################################
formattedElapsedTime = String.format("%02d Day %02d Hour %02d Minute %02d Second %d Millisecond %d Nanosecond",
duration.toDaysPart(), duration.toHoursPart(), duration.toMinutesPart(), duration.toSecondsPart(),
duration.toMillisPart(), duration.toNanosPart());
System.out.println(formattedElapsedTime);
// ##############################################################################
}
}
输出:
PT3429H21M18.987654321S
142 Day 21 Hour 21 Minute 18 Second 987 Millisecond 987654321 Nanosecond
142 Day 21 Hour 21 Minute 18 Second 987 Millisecond 987654321 Nanosecond
从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。