web-dev-qa-db-fra.com

Format java.util.Date SSSSSS: si ce n'est pas microsecondes, quels sont les 3 derniers chiffres?

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

30
maxxyme

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 )

79
ppeterka

tl; dr

Instant.now()
       .toString() 

2018-02-02T00: 28: 02.487114Z

Instant.parse(
    "2018-02-02T00:28:02.487114Z"
)

Java.time

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" ) ) ;

À propos de Java.time

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 .

8
Basil Bourque

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.

2
tutejszy

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.

0
Evgeniy Dorofeev