web-dev-qa-db-fra.com

Java SimpleDateFormat Décalage du fuseau horaire avec une minute séparée par deux points

Comment puis-je obtenir ma date au format 2012-11-25T23:50:56.193+01:00 en utilisant SimpleDateFormat?
Si j'utilise Z au format comme

yyyy-MM-dd'T'hh:mm:ss.SSSZ

alors ça montre

2013-03-06T11:49:05.490+0100

18
user2139437

Vous pouvez obtenir le décalage de fuseau horaire formaté comme +01:00 avec le SimpleDateFormat dans Java 7 (yyyy-MM-dd'T'HH:mm:ss.SSSXXX), ou avec les Joda DateTimeFormat (yyyy-MM-dd'T'HH:mm:ss.SSSZZ).

37
ejain

Voici la réponse 2017. S'il y a un moyen possible (qui existe), jetez les classes obsolètes comme SimpleDateFormat par dessus bord et utilisez les classes modernes et plus pratiques dans Java.time . En particulier, le format souhaité, 2012-11-25T23:50:56.193+01:00 Est conforme à la norme ISO-8601 et sort donc de la boîte avec les classes les plus récentes, utilisez simplement OffsetDateTime.toString():

    OffsetDateTime time = OffsetDateTime.now();
    System.out.println(time.toString());

Cela imprime quelque chose comme

2017-05-10T16:14:20.407+02:00

Une chose dont vous pouvez ou non vouloir être conscient, cependant, il imprime autant de groupes de 3 décimales sur les secondes qu'il en faut pour imprimer la précision dans l'objet OffsetDateTime. Apparemment, sur mon ordinateur "maintenant" vient avec une précision de millisecondes (secondes avec trois décimales).

Si vous avez un objet Date à l'ancienne, par exemple, vous l'avez obtenu à partir d'un appel à une méthode héritée, je recommande la première chose à faire est de le convertir en Instant, qui est l'un des cours modernes. De là, vous pouvez facilement d'autres conversions en fonction de vos besoins:

    Date now = new Date();
    OffsetDateTime time = now.toInstant().atZone(ZoneId.systemDefault()).toOffsetDateTime();
    System.out.println(time.toString());

Je fais vraiment plus de conversions que nécessaire. atZone(ZoneId.systemDefault()) a produit un ZonedDateTime, et son toString() ne vous donnera pas toujours le format que vous avez dit souhaité; mais il peut facilement y être formaté:

    ZonedDateTime time = now.toInstant().atZone(ZoneId.systemDefault());
    System.out.println(time.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
2
Ole V.V.