2009-05-29 11 views
119

Come convertire un valore da nanosecondi in secondi?Come convertire i nanosecondi in secondi usando l'enum TimeUnit?

Ecco il segmento di codice:

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

L'errore è

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

Cosa significa?

+0

L'errore significa che non è possibile creare un'istanza della scrivi 'TimeUtil', perché è un' enum' (enumeratore). Se vuoi usare 'TimeUnit', dovresti usare' TimeUnit.NANOSECONDS.toSeconds (elapsedTime) '. In bocca al lupo! –

risposta

171

Beh, si può solo dividere per 1000 milioni:

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

Se si utilizza TimeUnit convertire, si otterrà il risultato di un lungo, quindi si perde precisione decimale, ma mantenere tutto precisione del numero.

+0

Nella maggior parte dei casi, penso che questa sia probabilmente la soluzione migliore. È sicuramente molto più veloce da leggere. –

+0

Vorrei cambiare fare 1000000000 a doppio per forzare la divisione a doppia precisione. –

+2

1000000000.0 è già un doppio; una costante float sarebbe 1000000000.0f. –

52

TimeUnit è un enum, quindi non è possibile crearne uno nuovo.

Quanto segue convertirà 1000000000000ns in secondi.

TimeUnit.NANOSECONDS.toSeconds(1000000000000L); 
+4

Credo che sia 10e + 9 non 1e + 12! –

+7

Questa è una risposta piuttosto tarda, ma il numero nell'esempio non è il numero di nanos in un secondo, è solo un numero da convertire. L'idea è di non dover conoscere quei valori. –

+2

Penso che questa dovrebbe essere la risposta accettata. Usare toXxx() è preferibile usare convert() perché con convert() non è ovvio quale direzione avviene la conversione, mentre con toXxx() lo è. –

314

TimeUnit Enum

La seguente espressione utilizza il TimeUnit enum (Java 5 e versioni successive) convertire da nanosecondi a secondi:

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

+1 per non reinventare la ruota. – Brett

+9

Non che questo metodo non includa frazioni di secondo. Quindi 4.9999999, sarebbero semplicemente 4 secondi. – Richard

+1

Questo è preferito perché non si dovrebbe mai scrivere 1 seguito da un intero pasticcio di 0 a causa di un errore molto incline. – demongolem

18

Per ridurre verbosità, è possibile utilizzare una di importazione statica:

-e quindi solo digitare

NANOSECONDS.toSeconds(elapsedTime); 
+1

+1 per aver menzionato l'importazione –

4

Si dovrebbe scrivere:

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

Assegnazione del endTime in una variabile potrebbe causare pochi nanosecondi. In questo approccio otterrai il tempo esatto trascorso.

E poi:

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

Ciò convertire un tempo di secondi in un doppio formato, che è più preciso di un valore intero:

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