Ist es sicher, System.currentTimeMillis () mit Clock.systemDefaultZone () naiv zu ersetzen. millis ()?

8

Java 8 führt die Oberfläche java.time.Clock ein, Das sollte mir erlauben, Systemzeit Anrufe effektiv zu verspotten (super!).

Ich möchte naiv Aufrufe von System.currentTimeMillis() durch Aufrufe von someClock.millis() ersetzen, aber es ist mir nicht klar, dass diese beiden Uhren tatsächlich die gleichen Werte in allen Fällen basierend auf dem in Clock.system* docs, die angeben, dass sie "... die beste verfügbare Systemuhr" verwenden. System.currentTimeMillis() gibt keine ähnlichen Behauptungen bezüglich der Verwendung der besten verfügbaren Uhr an.

    
idbentley 15.05.2015, 20:49
quelle

4 Antworten

2

Nun, nein, Sie können nicht garantieren, dass es genau so sein wird, denn

  

Die Systemfactory-Methoden liefern Uhren basierend auf der besten verfügbaren Systemuhr. Dies kann System.currentTimeMillis () oder einen Takt mit höherer Auflösung verwenden, wenn einer verfügbar ist

Es heißt also ausdrücklich, dass es eine bessere Uhr verwenden kann, was bedeutet, dass es absolut anders sein kann.

Auch wenn Sie alle vorhandenen Implementierungen analysieren und feststellen, dass sie alle System.currentTimeMillis() verwenden, können Sie nicht garantieren, dass die Dinge so bleiben. Daher wäre es vergeblich, sich darauf zu verlassen.

Ob das für Ihre Zwecke nah genug ist, hängt ganz von Ihrer Anwendung und Ihren persönlichen Vorlieben ab.

    
CupawnTae 15.05.2015, 20:58
quelle
0

java.time.SystemClock Implementierung von java.time.Clock Aufrufe System.currentTimeMillis() in seiner millis() Methode, also ist dies im Grunde das Gleiche und schließlich werden alle Implementierungen Zeit von gettimeofday Systemaufruf

    
Stanislav Levental 15.05.2015 20:56
quelle
0

Die Antwort liegt bei dieser Aussage:

  

.. Dies kann System.currentTimeMillis () oder einen Takt mit höherer Auflösung verwenden    wenn einer verfügbar ist .

Ich denke, es ist sicher, den Ersatz zu machen, so dass Sie, wann immer möglich, den Takt mit der höheren Auflösung wie System.nanoTime() erhalten.

    
PCM 15.05.2015 21:04
quelle
0

JDK 9 wird eine höhere Präzisionstakt haben, siehe Ausgabe 8068730 . Daher können sich System.currentTimeMillis() und Clock.systemUTC().millis() unterscheiden. Berücksichtigen Sie, dass das currentTimeMillis unter Windows heute einen Wert mit niedriger Genauigkeit liefert, der in JDK 9 mit hoher Wahrscheinlichkeit sogar auf der Millisekundenebene besser ist.

Eine Option, um das gleiche Verhalten zu gewährleisten, besteht darin, die Klasse Clock selbst zu implementieren, indem Sie currentTimeMillis aufrufen.

    
JodaStephen 16.05.2015 12:24
quelle

Tags und Links