tl; dr
Java 9 und höher: Bis zu Nanosekunden Auflösung bei der Erfassung des aktuellen Moments. Das sind 9 Nachkommastellen.
Instant.now()
2017-12-23T12: 34: 56.123456789Z
Um auf Mikrosekunden zu beschränken , schneiden Sie ab .
Instant // Represent a moment in UTC.
.now() // Capture the current moment. Returns a `Instant` object.
.truncatedTo( // Lop off the finer part of this moment.
ChronoUnit.MICROS // Granularity to which we are truncating.
) // Returns another `Instant` object rather than changing the original, per the immutable objects pattern.
2017-12-23T12: 34: 56.123456Z
In der Praxis werden nur Mikrosekunden angezeigt, mit denen .now
herkömmliche Computerhardwaretakte in Nanosekunden nicht genau sind .
Einzelheiten
Die anderen Antworten sind ab Java 8 etwas veraltet.
java.time
Java 8 und höher wird mit dem Java.time- Framework geliefert . Diese neuen Klassen ersetzen die fehlerhaften, problematischen Datums- und Uhrzeitklassen, die mit den frühesten Java-Versionen wie java.util.Date/.Calendar und java.text.SimpleDateFormat ausgeliefert wurden. Das Framework wird durch JSR 310 definiert, inspiriert von Joda-Time , erweitert durch das ThreeTen-Extra-Projekt.
Die Klassen in java.time werden in Nanosekunden aufgelöst , viel feiner als die Millisekunden, die sowohl von den alten Datums- / Uhrzeitklassen als auch von Joda-Time verwendet werden. Und feiner als die in der Frage gestellten Mikrosekunden .
Clock
Implementierung
Während die java.time-Klassen Daten unterstützen, die Werte in Nanosekunden darstellen, generieren die Klassen noch keine Werte in Nanosekunden. Die now()
Methoden verwenden dieselbe alte Uhrenimplementierung wie die alten Datums- / Zeitklassen System.currentTimeMillis()
. Wir haben die neue Clock
Schnittstelle in java.time, aber die Implementierung für diese Schnittstelle ist dieselbe alte Millisekundenuhr.
Sie können also die Textdarstellung des Ergebnisses von formatieren ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )
, um neun Ziffern einer Bruchsekunde zu sehen, aber nur die ersten drei Ziffern haben folgende Zahlen:
2017-12-23T12:34:56.789000000Z
Neue Uhr in Java 9
Die OpenJDK- und Oracle-Implementierungen von Java 9 verfügen über eine neue Standardimplementierung Clock
mit feinerer Granularität bis zur vollen Nanosekundenfähigkeit der java.time-Klassen.
Weitere Informationen finden Sie im OpenJDK-Problem. Erhöhen Sie die Genauigkeit der Implementierung von java.time.Clock.systemUTC () . Dieses Problem wurde erfolgreich implementiert.
2017-12-23T12:34:56.123456789Z
Auf einem MacBook Pro (Retina, 15 Zoll, Ende 2013) mit macOS Sierra erhalte ich den aktuellen Moment in Mikrosekunden (bis zu sechs Dezimalstellen).
2017-12-23T12:34:56.123456Z
Hardware-Uhr
Denken Sie daran, dass Clock
Ihre Ergebnisse auch bei einer neuen, feineren Implementierung je nach Computer variieren können. Java hängt von der Uhr der zugrunde liegenden Computerhardware ab, um den aktuellen Moment zu ermitteln.
- Die Auflösung der Hardware-Uhren variiert stark. Wenn beispielsweise die Hardware-Uhr eines bestimmten Computers nur eine Mikrosekunden- Granularität unterstützt, haben alle generierten Datums- / Uhrzeitwerte nur sechs Sekundenbruchteil, wobei die letzten drei Stellen Nullen sind.
- Die Genauigkeit der Hardware-Uhren variiert stark. Nur weil eine Uhr einen Wert mit mehreren Stellen im Dezimalbruchteil einer Sekunde erzeugt, können diese Stellen ungenau sein, nur Annäherungen, die von der tatsächlichen Zeit abweichen, wie sie von einer Atomuhr gelesen werden könnten . Mit anderen Worten, nur weil Sie eine Reihe von Ziffern rechts von der Dezimalstelle sehen, bedeutet dies nicht, dass Sie darauf vertrauen können, dass die zwischen diesen Messwerten verstrichene Zeit bis zu diesem winzigen Grad wahr ist.