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.
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.
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
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.
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.