tl; dr
Como converter java.util.Date em java.sql.Date?
Não. Ambas as classes estão obsoletas.
- Use as classes java.time em vez do legado
java.util.Date
e java.sql.Date
com o JDBC 4.2 ou posterior.
- Converta de / para java.time se estiver operando com código ainda não atualizado para java.time.
Exemplo de consulta com PreparedStatement
.
myPreparedStatement.setObject(
… , // Specify the ordinal number of which argument in SQL statement.
myJavaUtilDate.toInstant() // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC).
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`.
.toLocalDate() // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object.
)
Substituições:
Instant
em vez de java.util.Date
Ambos representam um momento no UTC. mas agora com nanossegundos em vez de milissegundos.
LocalDate
em vez de java.sql.Date
Ambos representam um valor somente de data sem uma hora do dia e sem um fuso horário.
Detalhes
Se você estiver tentando trabalhar com valores somente de data (sem hora do dia, sem fuso horário), use a LocalDate
classe em vez de java.util.Date
.
java.time
No Java 8 e posterior, as classes antigas de data e hora problemáticas incluídas nas versões anteriores do Java foram substituídas pelo novo pacote java.time . Consulte o Tutorial do Oracle . Grande parte da funcionalidade foi portada para Java 6 e 7 no ThreeTen-Backport e posteriormente adaptada ao Android no ThreeTenABP .
Um tipo de dados SQL DATE
deve ser apenas de data, sem hora do dia e sem fuso horário. Java nunca teve exatamente essa classe † até java.time.LocalDate
no Java 8. Vamos criar esse valor obtendo a data de hoje de acordo com um fuso horário específico (o fuso horário é importante para determinar uma data em que um novo dia amanhece mais cedo em Paris do que em Montreal, por exemplo).
LocalDate todayLocalDate = LocalDate.now( ZoneId.of( "America/Montreal" ) ); // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST".
Neste ponto, podemos terminar. Se o seu driver JDBC estiver em conformidade com as especificações do JDBC 4.2 , você poderá passar uma LocalDate
via setObject
a PreparedStatement
para armazenar em um campo SQL DATE.
myPreparedStatement.setObject( 1 , localDate );
Da mesma forma, use ResultSet::getObject
para buscar de uma coluna SQL DATE para um LocalDate
objeto Java . A especificação da classe no segundo argumento torna seu código seguro .
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
Em outras palavras, toda essa pergunta é irrelevante no JDBC 4.2 ou posterior.
Se o seu driver JDBC não funcionar dessa maneira, você precisará voltar a converter para os tipos java.sql.
Converta em java.sql.Date
Para converter, use novos métodos adicionados às classes de data e hora antigas. Podemos ligar java.sql.Date.valueOf(…)
para converter um LocalDate
.
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
E indo na outra direção.
LocalDate localDate = sqlDate.toLocalDate();
Convertendo de java.util.Date
Embora você deva evitar o uso das classes de data e hora antigas, você pode ser forçado a trabalhar com código existente. Nesse caso, você pode converter de / para java.time.
Passe pela Instant
classe, que representa um momento na linha do tempo no UTC. Uma Instant
idéia é semelhante a uma java.util.Date
. Mas observe que Instant
tem uma resolução de até nanossegundos, enquanto java.util.Date
apenas milissegundos resolução.
Para converter, use novos métodos adicionados às classes antigas. Por exemplo, java.util.Date.from( Instant )
e java.util.Date::toInstant
.
Instant instant = myUtilDate.toInstant();
Para determinar uma data, precisamos do contexto de um fuso horário. Por um determinado momento, a data varia em todo o mundo por fuso horário. Aplique a ZoneId
para obter a ZonedDateTime
.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
† A classe java.sql.Date finge ser apenas de data sem uma hora do dia, mas na verdade faz uma hora do dia, ajustada para a meia-noite. Confuso? Sim, as antigas classes de data e hora estão uma bagunça.
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
, eSimpleDateFormat
.
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?
O projeto ThreeTen-Extra estende o 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 .