tl; dr
As outras respostas estão obsoletas no 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
Por acaso, seu formato de string está em conformidade com o padrão ISO 8601 . Esse padrão define formatos sensíveis para representar vários valores de data e hora como texto.
java.time
As classes old java.util.Date/ .Calendarand java.text.SimpleDateFormatforam substituídas pela estrutura java.time incorporada no Java 8 e posterior. Veja o tutorial . Evite as classes antigas, pois elas provaram ser mal projetadas, confusas e problemáticas.
Parte do design inadequado das classes antigas o mordeu, onde o toStringmétodo aplica o fuso horário atual da JVM ao gerar uma representação de texto do valor de data e hora que está realmente no UTC (GMT); bem-intencionado, mas confuso.
As classes java.time usam os formatos ISO 8601 por padrão ao analisar / gerar representações textuais de valores de data e hora. Portanto, não há necessidade de especificar um padrão de análise.
An Instanté um momento na linha do tempo no UTC .
Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );
Você pode aplicar um fuso horário conforme necessário para produzir um ZonedDateTimeobjeto.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );
