tl; dr
O projeto Joda-Time está no modo de manutenção, agora substituído pelas classes java.time .
- Basta usar
java.time.Instant
classe.
- Não há necessidade de:
LocalDateTime
java.sql.Timestamp
- Cordas
Capture o momento atual no UTC.
Instant.now()
Para armazenar esse momento no banco de dados:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
Para recuperar esse momento da base de dados:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
Para ajustar a hora do relógio de parede com a de um fuso horário específico.
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
é a classe errada
Outras respostas estão corretas, mas não apontam que essa LocalDateTime
é a classe errada para o seu propósito.
No java.time e no Joda-Time , um LocalDateTime
propositalmente não possui qualquer conceito de fuso horário ou deslocamento do UTC. Como tal, não representa um momento e não é um ponto na linha do tempo. A LocalDateTime
representa uma idéia aproximada de momentos em potencial ao longo de um período de 26 a 27 horas.
Use a LocalDateTime
para quando a zona / deslocamento for desconhecida (não é uma boa situação) ou quando o deslocamento da zona for indeterminado. Por exemplo, "O Natal começa no primeiro momento de 25 de dezembro de 2018" seria representado como a LocalDateTime
.
Use a ZonedDateTime
para representar um momento em um fuso horário específico. Por exemplo, o Natal começando em qualquer zona específica, como Pacific/Auckland
ou America/Montreal
seria representada com um ZonedDateTime
objeto.
Por um momento sempre no UTC, use Instant
.
Instant instant = Instant.now() ; // Capture the current moment in UTC.
Aplique um fuso horário. Mesmo momento, mesmo ponto na linha do tempo, mas visualizado com uma hora diferente do relógio de parede.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
Então, se eu puder converter entre LocalDate e LocalDateTime,
Não, estratégia errada. Se você possui um valor somente de data e deseja um valor de data e hora, deve especificar uma hora do dia. Essa hora do dia pode não ser válida nessa data para uma zona específica - nesse caso, a ZonedDateTime
classe ajusta automaticamente a hora do dia, conforme necessário.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Se você deseja o primeiro momento do dia como sua hora do dia, deixe java.time determinar esse momento. Não assuma que o dia começa às 00:00:00. Anomalias como horário de verão (DST) significam que o dia pode começar em outro horário, como 01:00:00.
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp
é a classe errada
O java.sql.Timestamp
faz parte dos incômodos aulas de data e hora de idade que estão agora legado, suplantaram inteiramente pelos java.time classes. Essa classe foi usada para representar um momento no UTC com uma resolução de nanossegundos . Esse propósito agora é servido java.time.Instant
.
JDBC 4.2 com getObject
/setObject
A partir do JDBC 4.2 e posterior, seu driver JDBC pode trocar diretamente objetos java.time com o banco de dados chamando:
Por exemplo:
myPreparedStatement.setObject( … , instant ) ;
... e ...
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Converter legado ⬌ moderno
Se você precisar interagir com o código antigo ainda não atualizado para java.time , converta-o usando os novos métodos adicionados às classes antigas.
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
…e…
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
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 .
java.sql.Timestamp
classe agora é herdada, substituída pelas classes java.time , especificamente porInstant
.