73 votes

Pourquoi la nouvelle API Java 8 Date Time n’a-t-elle pas une précision nanoseconde?

L'une des caractéristiques de la nouvelle Date du Temps de l'API en Java 8 est censé être une précision à la nanoseconde. Cependant lorsque j'imprime la Date actuelle Heure de la console comme

DateTimeFormatter formatter = DateTimeFormatter
    .ofPattern("yyyy-MM-dd'T'HH:mm:ss,nnnnnnnnnZ");
System.out.println(OffsetDateTime.now().format(formatter)); 

Je ne vois que de la précision à la milliseconde: 2015-11-02T12:33:26,746000000+0100

Le système d'exploitation ne semblent appuyer une précision à la nanoseconde. Lorsque j'imprime la date actuelle heure via le Terminal

date -Ins

Je vois 2015-11-02T12:33:26,746134417+0100

Comment puis-je obtenir une précision à la nanoseconde en Java? Je suis en cours d'exécution Oracle Java 1.8.0_66 sur Ubuntu 14.04 64 bits

106voto

Jon Skeet Points 692016

L' java.time API en général n' ont une précision à la nanoseconde. Par exemple:

DateTimeFormatter formatter = DateTimeFormatter
    .ofPattern("yyyy-MM-dd'T'HH:mm:ss,nnnnnnnnnZ");
OffsetDateTime odt = OffsetDateTime.of(2015, 11, 2, 12, 38, 0, 123456789, ZoneOffset.UTC);
System.out.println(odt.format(formatter));

Sortie:

2015-11-02T12:38:00,123456789+0000

Cependant, c'est l'horloge de la valeur retournée par OffsetDateTime.now() , qui est de retourner une valeur qui n'a de millisecondes.

D' Clock:

L'horloge de la mise en œuvre proposée ici est basée sur l' System.currentTimeMillis(). Cette méthode fournit peu ou pas de garantie sur l'exactitude de l'horloge. Les Applications nécessitant une mesure plus précise de l'horloge doit mettre en œuvre cette classe abstraite eux-mêmes en utilisant une autre horloge externe, tel qu'un serveur NTP.

Donc il n'y a rien d'intrinsèquement imprécis ici - juste l'implémentation par défaut de Clock l'aide System.currentTimeMillis(). Vous pouvez éventuellement créer votre propre plus précis de la sous-classe. Cependant, il faut noter que l'ajout de plus de précision, sans ajout de plus de précision n'est probablement pas très utile. (Il y a des moments où il pourrait être, il est vrai...)

56voto

Meno Hochschild Points 6026

Pour faire un ajout important à la réponse de Jon Skeet, Java 9 est censé faire une horloge dans l'amélioration de la précision - voir le journal du bogue. Arrière-plan: Sur de nombreux systèmes d'exploitation (en particulier Linux), il y a de meilleures horloges disponibles.

Le Java SE 8 spécification de java.temps.L'horloge indique que "L' système d'usine méthodes fournissent des horloges basées sur les meilleures disponibles
l'horloge système. Il peut utiliser le Système.currentTimeMillis(), ou plus la résolution de l'horloge si l'on est disponible.". Dans le JDK 8 la mise en œuvre
de l'horloge retourné a été basé sur le Système.currentTimeMillis(), et ainsi, ne dispose que d'une milliseconde. Dans le JDK 9, la mise en œuvre
est basé sur le sous-jacent natif de l'horloge qui Système.currentTimeMillis (), offrant le maximum de résolution disponible à partir de cette horloge. Sur la plupart des systèmes, cela peut être microsecondes, ou parfois même dixième de seconde.

Une application faisant l'hypothèse que l'horloge renvoyées par ces système de méthodes de fabrique aura toujours millisecondes de précision et de activement en dépend, peut donc besoin d'être mis à jour afin de prendre en compte la possibilité d'une plus grande résolution, tel qu'il a été
indiqué dans la documentation de l'API.

Il convient également de noter l' (exotique) fait que la précision de seconde sera pas près de secondes intercalaires - même pas en Java 9.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X