Jak przekonwertować nanosekundy na sekundy przy użyciu wyliczenia TimeUnit?


145

Jak przekonwertować wartość z nanosekund na sekundy?

Oto segment kodu:

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

Błąd jest

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

Co to znaczy?


4
Błąd oznacza, że ​​nie można utworzyć wystąpienia typu TimeUtil, ponieważ jest to enum(moduł wyliczający). Jeśli chcesz użyć TimeUnit, powinieneś użyć TimeUnit.NANOSECONDS.toSeconds(elapsedTime)zamiast tego. Powodzenia!
Daniel Kvist

Odpowiedzi:


200

Cóż, możesz po prostu podzielić przez 1 000 000 000:

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

Jeśli użyjesz TimeUnitdo konwersji, otrzymasz wynik jako długi, więc stracisz dokładność dziesiętną, ale zachowasz dokładność liczb całkowitych.


78
Ale co, jeśli liczba nanosekund w ciągu sekundy się zmieni? : P
geofftnz

9
Ta odpowiedź jest teraz błędna - convert()a toFoo()wszystkie metody zwracają longteraz docs.oracle.com/javase/6/docs/api/java/util/concurrent/ ...
Riking

3
@mbarrows Jednak ta odpowiedź jest nadal słuszna , ponieważ TimeUnitrozwiązanie powoduje utratę specyficzności. TimeUnit.SECONDS.convert(500, TimeUnit.MILLISECONDS);wróci 0, nie 0.5. To po prostu zależy od twojego przypadku użycia, który z nich jest lepszy.
nbrooks

17
Całkowicie zgadzam się z @nbrooks tutaj. Użycie TimeUnit nie wyświetli ułamków sekundy, zamiast tego zwróci 0. Jeśli nie chcesz używać zakodowanej na stałe 10-cyfrowej liczby, użyj czegoś takiego jak 1E9. Na przykład: double seconds = ((double) nanoseconds) / 1E9; robiłbym to za każdym razem według osobistych preferencji.
TechTrip

3
Użyj tej metody w przypadku metody TimeUnit Enum, jeśli chcesz ułamków sekundy. Użycie TimeUnit Enum nie zaokrągla nawet do najbliższej sekundy, po prostu odcina ułamki sekundy. Więc 4,999999, to po prostu 4.
Dick Lucas,

354

TimeUnit Enum

Poniższe wyrażenie używa TimeUnitwyliczenia (Java 5 i nowsze) do konwersji z nanosekund na sekundy:

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

14
Nie chodzi o to, że ta metoda nie obejmuje ułamków sekundy. Więc 4,9999999, to po prostu 4 sekundy.
Dick Lucas

1
Jest to preferowane, ponieważ nigdy nie należy zapisywać 1, po którym następuje cały bałagan z zerami, ponieważ jest to bardzo podatne na błędy.
demongolem

1
możesz to zapisać w ten sposób elapsedTime = (end_time - start_time) / 1e9;
Hasson

1
Jeśli zostanę 59 minut i 50 sekund, nadal pokazuje, że upłynęło 0h ... Co nie jest idealne. Czy jest więc jakiś sposób, aby ta metoda działała z ułamkami?
user1156544

58

TimeUnit jest wyliczeniem, więc nie można utworzyć nowego.

Poniższe instrukcje konwertują 1000000000000ns na sekundy.

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

4
Wierzę, że to 10e + 9, a nie 1e + 12!
Adam Arold

8
To dość późna odpowiedź, ale liczba w przykładzie nie jest liczbą nanosekund na sekundę, to tylko liczba do konwersji. Chodzi o to, aby nie musieć znać tych wartości.
Nick Veys,

2
Myślę, że to powinna być akceptowana odpowiedź. Użycie toXxx () jest lepsze niż użycie convert (), ponieważ w przypadku funkcji convert () nie jest oczywiste, w którym kierunku następuje konwersja, podczas gdy w przypadku toXxx () jest.
Klitos Kyriacou

21

Aby zmniejszyć szczegółowość, możesz użyć importu statycznego:

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

- i odtąd po prostu wpisz

NANOSECONDS.toSeconds(elapsedTime);

6

Powinieneś napisać:

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

Przypisanie endTime do zmiennej może spowodować kilka nanosekund. W tym podejściu otrzymasz dokładny czas, który upłynął.

I wtedy:

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

4

Spowoduje to przekonwertowanie czasu na sekundy w formacie podwójnym, który jest dokładniejszy niż wartość całkowita:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.