Como converter nanossegundos para segundos usando o enum TimeUnit?
Pergunta
Como converter um valor de nanossegundos para segundos?
Aqui está o segmento de código:
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");
}}
O erro é
Stamper.java:16: enum types may not be instantiated.
O que isso significa?
Solução
Bem, você poderia simplesmente dividir por 1.000 milhões:
long elapsedTime = end - start;
double seconds = (double)elapsedTime / 1_000_000_000.0;
Se você usar TimeUnit
para converter, você vai obter o resultado como uma longa, então você vai perder precisão decimal, mas manter a precisão número inteiro.
Outras dicas
TimeUnit
Enum
A expressão a seguir usa o TimeUnit
enum (Java 5 e posterior) converter de nanossegundos para segundos:
TimeUnit.SECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS)
TimeUnit é uma enumeração, então você não pode criar um novo.
A seguir irá converter 1000000000000ns de segundos.
TimeUnit.NANOSECONDS.toSeconds(1000000000000L);
Para reduzir a verbosidade, você pode usar uma importação estática:
import static java.util.concurrent.TimeUnit.NANOSECONDS;
-e daí em diante basta digitar
NANOSECONDS.toSeconds(elapsedTime);
Você deve escrever:
long startTime = System.nanoTime();
long estimatedTime = System.nanoTime() - startTime;
Atribuição do endTime em uma variável pode causar alguns nanossegundos. Nesta abordagem, você vai ter o tempo exato decorrido.
E, em seguida:
TimeUnit.SECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS)
Isto irá converter uma hora de segundos em um formato duplo, que é mais preciso do que um valor inteiro:
double elapsedTimeInSeconds = TimeUnit.MILLISECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS) / 1000.0;