web-dev-qa-db-fra.com

Java SimpleDateFormat ("aaaa-MM-jj'T'HH: mm: ss'Z '") donne le fuseau horaire au format IST.

J'ai le constructeur SimpleDateFormat en tant que

SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")

et je suis en train d'analyser la chaîne "2013-09-29T18:46:19Z".

J'ai lu qu'ici, Z représente le fuseau horaire GMT/UTC. mais quand j'imprime cette date sur la console, il imprime IST timezne pour la date renvoyée.

Maintenant, ma question est de savoir si mon résultat est correct ou non?

123
Pradip Borde

Vous n'avez pas défini le fuseau horaire, vous avez seulement ajouté un Z à la fin de la date/heure. Cela ressemblera donc à une date/heure GMT, mais cela ne changera pas la valeur.

Réglez le fuseau horaire sur GMT et il sera correct.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
207
Peter Lawrey

'T' et 'Z' sont considérés ici comme des constantes. Vous devez passer Z sans les guillemets. De plus, vous devez spécifier le fuseau horaire dans la chaîne d'entrée.

Exemple: 2013-09-29T18:46:19-0700 Et le format comme "yyyy-MM-dd'T'HH:mm:ssZ"

84
Subir Kumar Sao

De ISO 8601 Chaîne à Java Objet Date

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
sdf.parse("2013-09-29T18:46:19Z"); //prints-> Mon Sep 30 02:46:19 CST 2013

si vous ne définissez pas TimeZone.getTimeZone("GMT"), il générera Sun Sep 29 18:46:19 CST 2013

De Java Objet Date à Chaîne ISO 8601

Et pour convertir Dateobject en norme ISO 8601 (yyyy-MM-dd'T'HH:mm:ss'Z'), utilisez le code suivant

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));           
System.out.println(sdf.format(new Date())); //-prints-> 2015-01-22T03:23:26Z

Notez également que sans ' ' en Z yyyy-MM-dd'T'HH:mm:ssZ imprime 2015-01-22T03:41:02+0000

41
AZ_

SI vous voulez gérer la représentation JSON de la date ' standard ', il est préférable d'utiliser ce modèle: "yyyy-MM-dd'T'HH:mm:ssX".

Remarquez le X à la fin. Il gérera les fuseaux horaires dans la norme ISO 8601 , et ISO 8601 est exactement ce qui produit cette déclaration en Javascript new Date().toJSON()

Comparé à d’autres réponses, il présente certains avantages:

  1. Vous n'avez pas besoin d'exiger de vos clients qu'ils envoient la date à l'heure GMT
  2. Vous n'avez pas besoin de convertir explicitement votre objet Date en GMT en utilisant ceci: sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
35
MyTitle

et si vous n'avez pas l'option Java8, mieux vaut utiliser 'aaaa-MM-jj'T'HH: mm: ssX XX' car ceci est correctement analysé à nouveau (alors qu'avec seulement un X cela peut ne pas être le cas ... en fonction de votre fonction d'analyse)

X génère: +01

XXX génère: +01: 00

15
Thirdman

tl; dr

Les autres réponses sont obsolètes à partir de Java 8.

Instant                           // Represent a moment in UTC. 
.parse( "2013-09-29T18:46:19Z" )  // Parse text in standard ISO 8601 format where the `Z` means UTC, pronounces “Zulu”.
.atZone(                          // Adjust from UTC to a time zone. 
    ZoneId.of( "Asia/Kolkata" )
)                                 // Returns a `ZonedDateTime` object. 

ISO 8601

Votre format de chaîne est conforme à la norme ISO 8601 . Cette norme définit des formats sensibles pour représenter diverses valeurs date-heure sous forme de texte.

Java.time

Les anciennes classes Java.util.Date/.Calendar et Java.text.SimpleDateFormat ont été remplacées par le framework Java.time intégré à Java 8 et versions ultérieures. Voir Tutoriel . Évitez les anciennes classes car elles se sont révélées mal conçues, déroutantes et gênantes.

Une partie de la mauvaise conception dans les anciennes classes vous a mordu, où la méthode toString applique le fuseau horaire par défaut actuel de la machine virtuelle lors de la génération d'une représentation textuelle de la valeur date-heure qui est réellement au format UTC (GMT); bien intentionné mais déroutant.

Les classes Java.time utilisent les formats ISO 8601 par défaut pour analyser/générer des représentations textuelles de valeurs date-heure. Donc, pas besoin de spécifier un modèle d'analyse.

Un Instant est un moment sur la timeline de UTC .

Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );

Vous pouvez appliquer un fuseau horaire selon vos besoins pour produire un objet ZonedDateTime .

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );
14
Basil Bourque