4 votes

Comment imprimer l'heure et la date actuelles au format ISO en java ?

Je suis censé envoyer la date et l'heure actuelles au format ISO comme indiqué ci-dessous :

'2018-02-09T13:30:00.000-05:00'

J'ai écrit le code suivant :

Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm");
SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.000'Z'");
System.out.println(formatter.format(date));
System.out.println(formatter1.format(date));

Il s'imprime de la manière suivante :

2018-04-30T12:02
2018-04-30T12:02:58.000Z

Mais il ne s'agit pas d'imprimer comme le format mentionné ci-dessus. Comment puis-je obtenir le -5:00 comme indiqué dans le format et qu'indique-t-il ?

8voto

Jorn Vernee Points 18630

En java 8, vous pouvez utiliser la nouvelle java.time api :

OffsetDateTime now = OffsetDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
System.out.println(formatter.format(now)); // e.g. 2018-04-30T08:43:41.4746758+02:00

Ce qui précède utilise le formateur de temps de données ISO standard. Vous pouvez également tronquer en millisecondes avec :

OffsetDateTime now = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS);

Ce qui donne quelque chose comme (seulement 3 chiffres après le point) :

2018-04-30T08:54:54.238+02:00

2voto

Ole V.V. Points 24677

Solution facile :

    System.out.println(OffsetDateTime.now(ZoneId.of("America/Panama")).toString());

Je viens d'obtenir ce résultat :

2018-04-30T02:12:46.442185-05:00

Pour contrôler que les secondes sont toujours imprimées avec exactement trois décimales :

    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXXX");
    OffsetDateTime now = OffsetDateTime.now(ZoneId.of("America/Panama"));
    System.out.println(now.format(formatter));

2018-04-30T02:12:46.442-05:00

La première, la version facile, imprimera suffisamment de groupes de trois décimales pour rendre la précision totale. Elle omettra aussi complètement les secondes si elles sont égales à 0,0. Les deux versions sont probablement correctes, car tout cela est autorisé par le format ISO 8601 que vous avez demandé. La personne qui reçoit la chaîne devrait donc être satisfaite de toute façon.

Veuillez indiquer le fuseau horaire souhaité. J'ai utilisé l'Amérique/Panama. Il est préférable de donner un fuseau horaire explicite pour un résultat prévisible.

J'utilise et je recommande java.time l'API moderne de date et d'heure de Java. Le site SimpleDateFormat que vous avez utilisé est non seulement dépassé depuis longtemps, mais il est aussi notoirement problématique. java.time est tellement plus agréable à travailler.

Que signifie -05:00 ?

-05:00 est un décalage par rapport à UTC (ou GMT, c'est presque la même chose). Ainsi, la chaîne de caractères de votre exemple provient probablement du fuseau horaire oriental de l'Amérique du Nord ou d'un autre endroit d'Amérique centrale ou du Sud (Cuba, Bolivie, pour n'en citer que quelques-uns qui utilisent ce décalage pendant une partie de l'année). Plus précisément -05:00 signifie que nous utilisons une horloge qui a 5 heures (et 0 minute) de retard sur UTC. Donc 2:12:46-05:00 indique le même moment que 7:12:46 UTC. Si nous savions seulement que l'heure est 2:12:46 et que nous ne connaissions pas le fuseau horaire ou le décalage, ce serait très ambigu. Un décalage est parfait pour transformer l'heure en un point dans le temps sans ambiguïté.

Liens

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