Как преобразовать наносекунды в секунды с помощью перечисления 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.

Что это значит?

Ответ 1

Хорошо, вы могли бы просто делить на 1 000 000 000:

long elapsedTime = end - start;
double seconds = (double)elapsedTime / 1000000000.0;

Если вы используете TimeUnit для преобразования, вы получите результат как длинный, так что вы потеряете десятичную точность, но сохраните точность целых чисел.

Ответ 2

TimeUnit Enum

В следующем выражении используется TimeUnit enum (Java 5 и более поздние версии) для преобразования от наносекунд к секундам:

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

Ответ 3

TimeUnit - это перечисление, поэтому вы не можете создать новый.

Следующее преобразует 1000000000000nsns в секунды.

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

Ответ 4

Чтобы уменьшить многословие, вы можете использовать статический импорт:

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

- и впредь просто наберите

NANOSECONDS.toSeconds(elapsedTime);

Ответ 5

Вы должны написать:

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

Назначение endTime в переменной может вызвать несколько наносекунд. При таком подходе вы получите точное время.

И затем:

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

Ответ 6

Это преобразует время в секундах в двойном формате, что более точно, чем целочисленное значение:

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