Je viens de tester ce code sur mon poste de travail Windows (8) et sur un système AIX:
public static void main(String[] args) {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(new Date()));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(new Date()));
}
et a obtenu quelque chose de similaire à cela à la suite:
2013-10-07 12:53:26.000905
2013-10-07 12:53:26.000906
Quelqu'un peut-il m'expliquer s'il vous plaît quels sont les derniers chiffres, sinon microsecondes?
Remarque: J'interagis avec une base de données DB2 dans laquelle des données chronologiques sont stockées à l'aide de colonnes temporisées sous forme de TIMESTAMP avec 6 chiffres APRÈS les secondes, c'est-à-dire des microsecondes (IMO). Mais tous ces "timestamps" sont créés en demandant la requête suivante:
SELECT current timestamp as currenttimestamp FROM Table ( values (1)) temp
Je me demande si, étant donné les résultats ci-dessus, je ne pourrais pas simplement utiliser dans mon code new Date()
au lieu de sélectionner le current timestamp
Dans la base de données.
Merci.
PS: J'ai cherché mais n'ai trouvé aucune question pertinente (réponse), comme: Heure actuelle en microsecondes en Java ou Obtenez l'heure avec heure, minute, seconde, milliseconde, microseconde
De la documentation de SimpleDateFormat :
Letter Date or Time Component Presentation Examples
S Millisecond Number 978
Donc, il est millisecondes , ou 1/1000ème de seconde. Vous venez de le formater avec 6 chiffres, vous ajoutez donc 3 zéros supplémentaires ...
Vous pouvez le vérifier de cette façon:
Date d =new Date();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").format(d));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS").format(d));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(d));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSS").format(d));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSS").format(d));
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(d));
Sortie:
2013-10-07 12:13:27.132
2013-10-07 12:13:27.132
2013-10-07 12:13:27.132
2013-10-07 12:13:27.0132
2013-10-07 12:13:27.00132
2013-10-07 12:13:27.000132
( Ideone fiddle )
Instant.now()
.toString()
2018-02-02T00: 28: 02.487114Z
Instant.parse(
"2018-02-02T00:28:02.487114Z"
)
Le réponse acceptée par ppeterka est correct. Votre utilisation abusive du modèle de formatage entraîne un affichage erroné des données, alors que la valeur interne est toujours limitée à quelques millisecondes.
Les classes gênantes SimpleDateFormat
et Date
que vous utilisez sont maintenant héritées, supplantées par les classes Java.time. Les classes Java.time gèrent la résolution nanosecondes , bien plus fine que la limite millisecondes des classes héritées.
L'équivalent de Java.util.Date
est Java.time.Instant
. Vous pouvez même convertir entre eux en utilisant de nouvelles méthodes ajoutées aux anciennes classes.
Instant instant = myJavaUtilDate.toInstant() ;
La classe Instant
représente un moment sur la ligne temporelle de UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).
Capturez le moment actuel en UTC. Java 8 capture le moment actuel en millisecondes, tandis qu'une nouvelle implémentation de Clock
dans Java 9 capture le moment avec une granularité plus fine, généralement de l'ordre de la microseconde. cela dépend des capacités de votre implémentation d'horloge matérielle, de système d'exploitation et de machine virtuelle Java.
Instant instant = Instant.now() ;
Générez une chaîne au format ISO 8601.
String output = instant.toString() ;
2018-02-02T00: 28: 02.487114Z
Pour générer des chaînes dans d'autres formats, recherchez Stack Overflow pour DateTimeFormatter
, déjà traité à plusieurs reprises.
Pour vous adapter à un fuseau horaire autre que UTC, utilisez ZonedDateTime
.
ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;
Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent l'ancien problème (ancien) hérité classes date-heure telles que Java.util.Date
, Calendar
, & SimpleDateFormat
.
Le projet Joda-Time , maintenant en mode de maintenance , conseille la migration vers les classes Java.time .
Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 31 .
Où obtenir les classes Java.time?
Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts à Java.time. Vous pouvez trouver ici quelques classes utiles telles que Interval
, YearWeek
, YearQuarter
, et plus .
J'ai utilisé une autre astuce pour formater la date avec une précision de 6 chiffres (microsecondes):
System.out.println(
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.").format(microseconds/1000)
+String.format("%06d", microseconds%1000000));
Cette technique peut être étendue davantage, aux nanosecondes et plus.
Utilisez Java.sql.Timestamp.toString si vous souhaitez obtenir des fractions de secondes dans la représentation textuelle. La différence entre Timestamp from DB et Java Date est que la précision de la base de données est nanoseconds tandis que Java La précision de la date est millisecondes.