Tl;dr
Les autres réponses sont dépassées à partir de Java 8.
Instant // Représente un moment en UTC.
.parse( "2013-09-29T18:46:19Z" ) // Analyse du texte au format ISO 8601 standard où le `Z` signifie UTC, prononcé "Zulu".
.atZone( // Ajuster de l'UTC à un fuseau horaire.
ZoneId.of( "Asia/Kolkata" )
) // Renvoie un objet `ZonedDateTime`.
ISO 8601
Votre format de chaîne est conforme à la norme ISO 8601. Cette norme définit des formats sensés pour représenter diverses valeurs de 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 ultérieur. Voir Tutoriel. Évitez les anciennes classes car elles se sont avérées mal conçues, confuses et problématiques.
Une partie de la mauvaise conception des anciennes classes vous a affecté, où la méthode toString
applique le fuseau horaire par défaut actuel du JVM lors de la génération d'une représentation textuelle de la valeur de date-heure qui est en réalité en UTC (GMT); bien intentionné mais déroutant.
Les classes java.time utilisent les formats ISO 8601 par défaut lors de l'analyse/génération de représentations textuelles des valeurs de date-heure. Il n'est donc pas nécessaire de spécifier un motif d'analyse.
Un Instant
est un moment sur la ligne de temps en UTC.
Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );
Vous pouvez appliquer un fuseau horaire au besoin pour produire un objet ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );