【问题标题】:Get Human readable time from nanoseconds从纳秒获取人类可读时间
【发布时间】:2017-07-12 15:01:53
【问题描述】:

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

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

Long remainingTime = allTimeForDownloading - elapsedTime;

但我不知道如何获得人类可读的纳秒形式;例如:1d 1h36s3m 50s

我该怎么做?

【问题讨论】:

  • 您介意为此使用一个库吗? PrettyTime 将是您所需要的。

标签: java android time duration datetime-conversion


【解决方案1】:

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

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);

}

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

【讨论】:

    【解决方案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】:

      这是我的旧代码,您也可以将其转换为天数。

        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;
      }
       }
      

      【讨论】:

        【解决方案4】:

        这是我的建议。这是基于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
        

        【讨论】:

          【解决方案5】:

          java.time

          您可以使用java.time.Duration,它以ISO-8601 standards 为蓝本,并作为JSR-310 implementation 的一部分引入Java-8Java-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 的更多信息。

          【讨论】:

            猜你喜欢
            • 2013-03-17
            • 1970-01-01
            • 2016-07-24
            • 1970-01-01
            • 1970-01-01
            • 2015-10-09
            • 1970-01-01
            • 2012-01-01
            相关资源
            最近更新 更多