如何使用 TimeUnit 枚举将纳秒转换为秒?

如何将一个值从纳秒转换为秒?

下面是代码段:

import java.io.*;
import java.util.concurrent.*;
..


class Stamper {


public static void main (String[] args) {
long start = System.nanoTime();
//some try with nested loops
long end = System.nanoTime();
long elapsedTime = end - start;


System.out.println("elapsed: " + elapsedTime + "nano seconds\n");


//convert to seconds
TimeUnit seconds = new TimeUnit();
System.out.println("which is " + seconds.toSeconds(elapsedTime) + " seconds");
}}

错误是

Stamper.java:16:  enum types may not be instantiated.

这是什么意思?

270349 次浏览

TimeUnit 是枚举,因此不能创建新的枚举。

下面将把100000000000ns 转换为秒。

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

你可以除以1,000,000,000:

long elapsedTime = end - start;
double seconds = (double)elapsedTime / 1_000_000_000.0;

如果您使用 TimeUnit进行转换,您将得到一个长的结果,因此您将失去十进制精度,但保持整数精度。

TimeUnit Enum

下面的表达式使用 TimeUnit枚举(Java5及更高版本)将纳秒转换为秒:

TimeUnit.SECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS)

为了减少冗长,您可以使用静态导入:

import static java.util.concurrent.TimeUnit.NANOSECONDS;

从今以后只要打字就行了

NANOSECONDS.toSeconds(elapsedTime);

你应该写:

    long startTime = System.nanoTime();
long estimatedTime = System.nanoTime() - startTime;

在变量中指定 endTime 可能会导致几纳秒的时间。在这种方法中,您将得到精确的运行时间。

然后:

TimeUnit.SECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS)

这将以双重格式将时间转换为秒,这比整数值更精确:

double elapsedTimeInSeconds = TimeUnit.MILLISECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS) / 1000.0;

Java 8Kotlin中,我使用 Duration.ofNanos(1_000_000_000)就像

val duration = Duration.ofNanos(1_000_000_000)
logger.info(String.format("%d %02dm %02ds %03d",
elapse, duration.toMinutes(), duration.toSeconds(), duration.toMillis()))

阅读更多 https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html