tl; dr
Java 9 et versions ultérieures: résolution jusqu'à nanosecondes lors de la capture du moment actuel. Cela fait 9 chiffres de fraction décimale.
Instant.now()
2017-12-23T12: 34: 56.123456789Z
Pour limiter aux microsecondes , tronquez .
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
En pratique, vous ne verrez que les microsecondes capturées avec, .now
car les horloges matérielles informatiques conventionnelles contemporaines ne sont pas précises en nanosecondes .
Détails
Les autres réponses sont quelque peu obsolètes à partir de Java 8.
java.time
Java 8 et versions ultérieures sont fournis avec le framework java.time . Ces nouvelles classes supplantent les classes date-heure défectueuses livrées avec les premières versions de Java telles que java.util.Date/.Calendar et java.text.SimpleDateFormat. Le framework est défini par JSR 310, inspiré de Joda-Time , étendu par le projet ThreeTen-Extra.
Les classes de java.time se résolvent en nanosecondes , beaucoup plus fines que les millisecondes utilisées à la fois par les anciennes classes date-heure et par Joda-Time. Et plus fin que les microsecondes posées dans la question.
Clock
la mise en oeuvre
Alors que les classes java.time prennent en charge les données représentant des valeurs en nanosecondes, les classes ne génèrent pas encore de valeurs en nanosecondes. Les now()
méthodes utilisent la même ancienne implémentation d'horloge que les anciennes classes de date-heure, System.currentTimeMillis()
. Nous avons la nouvelle Clock
interface dans java.time mais l'implémentation de cette interface est la même vieille horloge en millisecondes.
Vous pouvez donc formater la représentation textuelle du résultat de ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )
pour voir neuf chiffres d'une fraction de seconde, mais seuls les trois premiers chiffres auront des nombres comme celui-ci:
2017-12-23T12:34:56.789000000Z
Nouvelle horloge dans Java 9
Les implémentations OpenJDK et Oracle de Java 9 ont une nouvelle Clock
implémentation par défaut avec une granularité plus fine, jusqu'à la pleine capacité nanoseconde des classes java.time.
Voir le problème OpenJDK, Augmentez la précision de l'implémentation de java.time.Clock.systemUTC () . Ce problème a été mis en œuvre avec succès.
2017-12-23T12:34:56.123456789Z
Sur un MacBook Pro (Retina, 15 pouces, fin 2013) avec macOS Sierra, j'obtiens le moment actuel en microsecondes (jusqu'à six chiffres de fraction décimale).
2017-12-23T12:34:56.123456Z
Horloge matérielle
N'oubliez pas que même avec une nouvelle Clock
implémentation plus fine , vos résultats peuvent varier selon l'ordinateur. Java dépend de l'horloge du matériel informatique sous-jacent pour connaître le moment actuel.
- La résolution des horloges matérielles varie considérablement. Par exemple, si l'horloge matérielle d'un ordinateur particulier ne prend en charge que la granularité en microsecondes , toutes les valeurs de date-heure générées n'auront que six chiffres de fraction de seconde, les trois derniers chiffres étant des zéros.
- La précision des horloges matérielles varie considérablement. Tout simplement parce qu'une horloge génère une valeur avec plusieurs chiffres de fraction décimale de seconde, ces chiffres peuvent être inexacts, juste des approximations, à la dérive du temps réel comme on pourrait le lire à partir d'une horloge atomique . En d'autres termes, ce n'est pas parce que vous voyez un tas de chiffres à droite de la marque décimale que vous pouvez faire confiance au temps écoulé entre ces lectures pour être vrai à ce degré infime.