Wie konvertiere ich Nanosekunden mit der TimeUnit-Enumeration in Sekunden?


145

Wie konvertiere ich einen Wert von Nanosekunden in Sekunden?

Hier ist das Codesegment:

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

Der Fehler ist

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

Was bedeutet das?


4
Der Fehler bedeutet, dass Sie den Typ nicht instanziieren können TimeUtil, da es sich um einen enum(Enumerator) handelt. Wenn Sie verwenden möchten TimeUnit, sollten Sie TimeUnit.NANOSECONDS.toSeconds(elapsedTime)stattdessen verwenden. Viel Glück!
Daniel Kvist

Antworten:


200

Nun, Sie könnten einfach durch 1.000.000.000 teilen:

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

Wenn Sie TimeUnitzum Konvertieren verwenden, erhalten Sie Ihr Ergebnis als Long, sodass Sie die Dezimalgenauigkeit verlieren, aber die Genauigkeit der ganzen Zahl beibehalten.


78
Was aber, wenn sich die Anzahl der Nanosekunden pro Sekunde ändert? : P
geofftnz

9
Diese Antwort ist jetzt falsch - convert()und toFoo()alle Methoden geben longs jetzt zurück docs.oracle.com/javase/6/docs/api/java/util/concurrent/…
Riking

3
@mbarrows Diese Antwort ist jedoch immer noch richtig , da die TimeUnitLösung zu einem Verlust an Spezifität führt. TimeUnit.SECONDS.convert(500, TimeUnit.MILLISECONDS);wird zurückkehren 0, nicht 0.5. Es hängt einfach von Ihrem Anwendungsfall ab, welcher davon vorzuziehen ist.
Nbrooks

17
Stimmen Sie @nbrooks hier voll und ganz zu. Wenn Sie TimeUnit verwenden, werden keine Sekundenbruchteile ausgegeben, sondern 0 zurückgegeben. Wenn Sie keine fest codierte 10-stellige Zahl verwenden möchten, verwenden Sie etwa 1E9. Zum Beispiel: double seconds = ((double) nanoseconds) / 1E9; Ich würde dies jedes Mal als persönliche Präferenz tun.
TechTrip

3
Verwenden Sie diese Methode gegenüber der TimeUnit Enum-Methode, wenn Sie Sekundenbruchteile wünschen. Wenn Sie die TimeUnit-Aufzählung verwenden, wird nicht einmal auf die nächste Sekunde gerundet, sondern es werden im Wesentlichen nur Sekundenbruchteile abgeschnitten. Also 4.9999999, wäre einfach 4.
Dick Lucas

354

TimeUnit Aufzählung

Der folgende Ausdruck verwendet die TimeUnitAufzählung (Java 5 und höher), um von Nanosekunden in Sekunden zu konvertieren:

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

14
Nicht, dass diese Methode keine Sekundenbruchteile enthält. Also 4,9999999 wären einfach 4 Sekunden.
Dick Lucas

1
Dies wird bevorzugt, da Sie niemals 1 ausschreiben sollten, gefolgt von einem ganzen Durcheinander von Nullen, da dies sehr fehleranfällig ist.
Demongolem

1
Sie können es so schreiben elapsedTime = (end_time - start_time) / 1e9;
Hasson

1
Wenn ich 59 Minuten und 50 Sekunden bleibe, heißt es immer noch, dass 0 Stunden vergangen sind ... Was nicht ideal ist. Gibt es eine Möglichkeit, diese Methode mit Brüchen arbeiten zu lassen?
user1156544

58

TimeUnit ist eine Aufzählung, daher können Sie keine neue erstellen.

Im Folgenden werden 1000000000000ns in Sekunden konvertiert.

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

4
Ich glaube es ist 10e + 9 nicht 1e + 12!
Adam Arold

8
Dies ist eine ziemlich späte Antwort, aber die Zahl im Beispiel ist nicht die Anzahl der Nanos in einer Sekunde, sondern nur eine Zahl, die konvertiert werden muss. Die ganze Idee ist, diese Werte nicht kennen zu müssen.
Nick Veys

2
Ich denke, das sollte die akzeptierte Antwort sein. Die Verwendung von toXxx () ist der Verwendung von convert () vorzuziehen, da bei convert () nicht ersichtlich ist, in welche Richtung die Konvertierung erfolgt, während dies bei toXxx () der Fall ist.
Klitos Kyriacou

21

Um die Ausführlichkeit zu verringern, können Sie einen statischen Import verwenden:

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

-und fortan nur noch tippen

NANOSECONDS.toSeconds(elapsedTime);

6

Sie sollten schreiben:

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

Das Zuweisen der endTime in einer Variablen kann einige Nanosekunden verursachen. Bei diesem Ansatz erhalten Sie die genaue verstrichene Zeit.

Und dann:

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

4

Dadurch wird eine Zeit in Sekunden in ein Doppelformat konvertiert, das genauer ist als ein ganzzahliger Wert:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.