tl; dr
Use a java.time.Instant
classe para analisar o texto no formato ISO 8601 padrão, representando um momento no UTC.
Instant.parse( "2010-10-02T12:23:23Z" )
ISO 8601
Esse formato é definido pelo padrão ISO 8601 para os formatos de string de data e hora.
Ambos:
… Use os formatos ISO 8601 por padrão para analisar e gerar strings.
Geralmente, você deve evitar o uso das classes java.util.Date /.Calendar e java.text.SimpleDateFormat antigas , pois são notoriamente problemáticas, confusas e com falhas. Se necessário para interoperar, você pode converter para lá e para cá.
java.time
Construído no Java 8 e posterior, está a nova estrutura java.time . Inspirado no Joda-Time , definido pelo JSR 310 , e estendido pelo projeto ThreeTen-Extra .
Instant instant = Instant.parse( "2010-10-02T12:23:23Z" ); // `Instant` is always in UTC.
Converta para a classe antiga.
java.util.Date date = java.util.Date.from( instant ); // Pass an `Instant` to the `from` method.
Fuso horário
Se necessário, você pode atribuir um fuso horário.
ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Define a time zone rather than rely implicitly on JVM’s current default time zone.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); // Assign a time zone adjustment from UTC.
Converter.
java.util.Date date = java.util.Date.from( zdt.toInstant() ); // Extract an `Instant` from the `ZonedDateTime` to pass to the `from` method.
Joda-Time
ATUALIZAÇÃO: O projeto Joda-Time agora está no modo de manutenção. A equipe aconselha a migração para as classes java.time .
Aqui está um exemplo de código no Joda-Time 2.8.
org.joda.time.DateTime dateTime_Utc = new DateTime( "2010-10-02T12:23:23Z" , DateTimeZone.UTC ); // Specifying a time zone to apply, rather than implicitly assigning the JVM’s current default.
Converta para a classe antiga. Observe que o fuso horário atribuído é perdido na conversão, pois o juDate não pode ser atribuído a um fuso horário.
java.util.Date date = dateTime_Utc.toDate(); // The `toDate` method converts to old class.
Fuso horário
Se necessário, você pode atribuir um fuso horário.
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTime_Montreal = dateTime_Utc.withZone ( zone );
Sobre java.time
A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como java.util.Date
, Calendar
, e SimpleDateFormat
.
O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
Você pode trocar objetos java.time diretamente com seu banco de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não há necessidade de strings, não há necessidade de java.sql.*
classes.
Onde obter as classes java.time?
- Java SE 8 , Java SE 9 e posterior
- Construídas em.
- Parte da API Java padrão com uma implementação em pacote configurável.
- O Java 9 adiciona alguns recursos e correções menores.
- Java SE 6 e Java SE 7
- Grande parte da funcionalidade java.time é portada para Java 6 e 7 no ThreeTen-Backport .
- Android
- Versões posteriores das implementações do pacote Android das classes java.time.
- Para anteriormente Android (<26), o ThreeTenABP projeto adapta ThreeTen-Backport (mencionados acima). Consulte Como usar o ThreeTenABP… .
O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de prova para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval
, YearWeek
, YearQuarter
, e mais .