Analyse de date Java avec une précision de l'ordre de la microseconde ou de la nanoseconde
Selon la SimpleDateFormat de documentation de classeJava
ne prend pas en charge granularité du temps au-dessus de millisecondes dans ses motifs modernes.
Ainsi, une chaîne de date comme
- 2015-05-09 00:10:23.999750900 //Les 9 derniers chiffres dénotent nanosecondes
quand analysée par le modèle
- aaaa-MM-jj HH:mm:ss.SSSSSSSSS //9 'S' symboles
en fait l'interprète de l'ensemble de la le nombre après la .
symbole (près de 1 milliard de dollars!) millisecondes et non pas comme la nanoseconde, entraînant la date
- 2015-05-20 21:52:53 UTC
c'est à dire plus de 11 jours à l'avance. Étonnamment, à l'aide d'un plus petit nombre de S
symboles encore les résultats dans tous les 9 chiffres pour être analysée (au lieu de, disons, le plus à gauche 3 pour .SSS
).
Il y a 2 façons de traiter ce problème correctement:
- Utilisation de la chaîne de prétraitement
- Utiliser un SimpleDateFormat mise en œuvre
Aurait-il une autre façon pour obtenir une solution correcte par la simple fourniture d'un modèle à la norme SimpleDateFormat
mise en œuvre, sans autres modifications du code ou de la manipulation de la chaîne?
source d'informationauteur PNS
Vous devez vous connecter pour publier un commentaire.
tl;dr
Nan
Non, vous ne pouvez pas utiliser SimpleDateFormat pour gérer nanosecondes.
Mais votre prémisse que...
...n'est plus vrai que de Java 89, 10 et plus tard avec java.temps classes intégrées. Et pas vraiment le cas de Java 6 et Java 7, soit, comme la plupart des java.temps la fonctionnalité est de retour-porté.
java.temps
SimpleDateFormat
et lesjava.util.Date
/.Calendar
classes sont maintenant dépassés par la nouvelle java.le temps paquet trouvé dans Java 8 (Tutoriel).Le nouveau java.les classes de temps de soutien l'ordre de la nanoseconde résolution. Ce soutien comprend l'analyse et la génération de neuf chiffres de la fraction de seconde. Par exemple, lorsque vous utilisez le
java.time.format
DateTimeFormatter
API, leS
modèle de lettre désigne une "fraction de seconde" plutôt que "millisecondes", et il peut faire face à des valeurs de l'ordre de la nanoseconde.Instant
Comme un exemple, le
Instantané
classe représente un moment dans UTC. SontoString
méthode génère unString
objet à l'aide de la norme ISO 8601 format. LeZ
sur la fin signifie UTC, prononcé “Zoulou”.Note que la capture de l'instant actuel dans Java 8 est limitée à la milliseconde. Le java.temps classes peuvent tenir une valeur en nanosecondes, mais permet seulement de déterminer l'heure actuelle avec millisecondes. Cette limitation est due à la mise en œuvre de
Clock
. En Java 9 et plus tard, une nouvelleClock
de mise en œuvre peuvent saisir le moment actuel dans résolution plus fine, selon les limites de votre matériel de l'hôte et du système d'exploitation, généralement microsecondes dans mon expérience.LocalDateTime
Votre exemple de la chaîne d'entrée de
2015-05-09 00:10:23.999750900
manque un indicateur de fuseau horaire et le décalage de l'heure UTC. Cela signifie qu'il ne pas représentent un moment, est pas un point sur la timeline. Au lieu de cela, il représente potentiel moments le long d'une plage d'environ 26 à 27 heures, la gamme de fuseaux horaires dans le monde entier.Pares une entrée comme une
LocalDateTime
objet. Tout d'abord, remplacer l'ESPACE dans le milieu avec uneT
pour se conformer à la norme ISO 8601, utilisé par défaut lors de l'analyse/génération de chaînes. Donc pas besoin de spécifier le format.java.sql.Timestamp
La
java.sql.Timestamp
classe gère également une résolution d'une, mais de façon un peu maladroite. Généralement préférable de faire votre travail à l'intérieur de java.les classes de temps. Pas besoin de toujours utiliserTimestamp
à nouveau comme des JDBC 4.2 et versions ultérieures.Et de la récupération.
Si vous utilisez une ancienne pré-4.2 pilote JDBC, vous pouvez utiliser
toInstant
etde
méthodes pour faire l'aller-retour entre java.sql.L'horodatage et la java.temps.Sur java.temps
La java.temps cadre est intégré dans Java 8 et les versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date du temps des classes comme
java.util.Date
Agenda
&SimpleDateFormat
.La Joda-Time projet, maintenant dans le mode de maintenanceconseille la migration vers le java.le temps classes.
Pour en savoir plus, consultez les Oracle Tutoriel. Et de recherche de Débordement de Pile pour de nombreux exemples et des explications. La spécification est JSR 310.
Vous pouvez échanger java.temps objets directement avec votre base de données. Utiliser un Pilote JDBC compatible avec JDBC 4.2 ou plus tard. Pas besoin de chaînes, pas besoin de
java.sql.*
classes.Où obtenir le java.les classes de temps?
La ThreeTen-Extra projet s'étend java.temps avec d'autres classes. Ce projet est un terrain d'essai pour de possibles futurs ajouts à java.temps. Vous pouvez trouver quelques classes utiles ici comme
Intervalle
YearWeek
YearQuarter
et plus.