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?
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"));
'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"
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 Date
object 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
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:
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
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
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.
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.
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 );