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.