Come convertire nanosecondi in secondi usando l'enum TimeUnit?


145

Come convertire un valore da nanosecondi a secondi?

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 questo?


4
L'errore indica che non è possibile creare un'istanza del tipo TimeUtil, poiché è un enum(enumeratore). Se si desidera utilizzare TimeUnit, è necessario utilizzare TimeUnit.NANOSECONDS.toSeconds(elapsedTime)invece. In bocca al lupo!
Daniel Kvist,

Risposte:


200

Bene, potresti semplicemente dividere per 1.000.000.000:

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

Se lo usi TimeUnitper la conversione, otterrai il risultato come lungo, quindi perderai la precisione decimale ma manterrai la precisione del numero intero.


78
Ma cosa succede se il numero di nanosecondi in un secondo cambia? : P
geofftnz,

9
Questa risposta ora è sbagliata - convert()e toFoo()tutti i metodi restituiscono longs ora docs.oracle.com/javase/6/docs/api/java/util/concurrent/…
Riking

3
@mbarrows Tuttavia questa risposta è ancora corretta in quanto la TimeUnitsoluzione si traduce in una perdita di specificità. TimeUnit.SECONDS.convert(500, TimeUnit.MILLISECONDS);tornerà 0, no 0.5. Dipende semplicemente dal tuo caso d'uso quale di questi è preferibile.
nbrooks

17
Sono pienamente d'accordo con @nbrooks qui. L'uso di TimeUnit non produrrà frazioni di secondo, invece di restituire 0. Se non si desidera utilizzare un numero di 10 cifre codificato, utilizzare qualcosa come 1E9. Ad esempio: double seconds = ((double) nanoseconds) / 1E9; lo farei ogni volta come preferenza personale.
TechTrip

3
Utilizzare questo metodo sul metodo TimeUnit Enum se si desidera frazioni di secondo. Usando la TimeUnit Enum non si arrotonda nemmeno al secondo più vicino, essenzialmente si limita a tagliare le frazioni di secondo. Quindi 4.9999999, sarebbe semplicemente 4.
Dick Lucas,

354

TimeUnit enum

L'espressione seguente utilizza l' TimeUnitenum (Java 5 e versioni successive) per convertire da nanosecondi a secondi:

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

14
Non che questo metodo non includa frazioni di secondo. Quindi 4.9999999, sarebbe semplicemente 4 secondi.
Dick Lucas,

1
Questo è preferito perché non dovresti mai scrivere 1 seguito da un intero casino di 0 perché è molto soggetto a errori.
demongolem,

1
puoi scriverlo in questo modo elapsedTime = (end_time - start_time) / 1e9;
Hasson,

1
Se rimango 59 minuti e 50 secondi dice ancora 0h trascorso ... Il che non è l'ideale. Quindi c'è un modo per far funzionare questo metodo con le frazioni?
user1156544

58

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

Quanto segue convertirà 1000000000000ns in secondi.

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

4
Credo che sia 10e + 9 non 1e + 12!
Adam Arold,

8
Questa è una risposta piuttosto tardiva, ma il numero nell'esempio non è il numero di nanos in un secondo, è solo un numero da convertire. L'idea è di non dover conoscere questi valori.
Nick Veys,

2
Penso che questa dovrebbe essere la risposta accettata. L'uso di toXxx () è preferibile all'uso di convert () perché con convert () non è ovvio in quale direzione avvenga la conversione, mentre con toXxx () lo è.
Klitos Kyriacou,

21

Per ridurre la verbosità, è possibile utilizzare un'importazione statica:

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

-e d'ora in poi basta digitare

NANOSECONDS.toSeconds(elapsedTime);

6

Dovresti scrivere:

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

L'assegnazione di endTime in una variabile potrebbe causare alcuni nanosecondi. In questo approccio otterrai esattamente il tempo trascorso.

E poi:

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

4

Questo convertirà un tempo in secondi in un doppio formato, che è più preciso di un valore intero:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.