Estou tentando usar um java.util.Date
como entrada e, em seguida, criando uma consulta com ele - então preciso de umjava.sql.Date
.
Fiquei surpreso ao descobrir que ela não podia fazer a conversão de forma implícita ou explícita - mas nem sei como faria isso, pois a API Java ainda é relativamente nova para mim.
import java.sql.*
no meu código, substituindo o java.util.date e, portanto, causando problemas ao atribuir valores de data que estavam bem com o último, mas não o primeiro. HTHDATE
significa apenas data.Respostas:
tl; dr
Não. Ambas as classes estão obsoletas.
java.util.Date
ejava.sql.Date
com o JDBC 4.2 ou posterior.Exemplo de consulta com
PreparedStatement
.Substituições:
Instant
em vez dejava.util.Date
Ambos representam um momento no UTC. mas agora com nanossegundos em vez de milissegundos.
LocalDate
em vez dejava.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 dejava.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).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
viasetObject
aPreparedStatement
para armazenar em um campo SQL DATE.Da mesma forma, use
ResultSet::getObject
para buscar de uma coluna SQL DATE para umLocalDate
objeto Java . A especificação da classe no segundo argumento torna seu código seguro .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 umLocalDate
.E indo na outra direção.
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. UmaInstant
idéia é semelhante a umajava.util.Date
. Mas observe queInstant
tem uma resolução de até nanossegundos, enquantojava.util.Date
apenas milissegundos resolução.Para converter, use novos métodos adicionados às classes antigas. Por exemplo,
java.util.Date.from( Instant )
ejava.util.Date::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 aZonedDateTime
.† 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 .fonte
Deixa pra lá....
explica isso. O link é http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm
fonte
epochseconds
milissegundos depois1,JAN,1970
. Mas e se quisermos armazenar a data de uma pessoa antes dessa data ... ou algo parecido com0000-00-00 as default
Com a outra resposta, você pode ter problemas com as informações de horário (compare as datas com resultados inesperados!)
Eu sugiro:
fonte
java.util.Date
,java.util.Calendar
ejava.text.SimpleDateFormat
estão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .Essa função retornará uma data SQL convertida do objeto de data java.
fonte
A conversão
java.util.Data
parajava.sql.Data
perderá hora, minuto e segundo. Então, se for possível, sugiro que você usejava.sql.Timestamp
assim:Para mais informações, você pode verificar esta pergunta .
fonte
No meu caso, escolher a data do JXDatePicker (java calender) e armazená-la no banco de dados como tipo de data SQL, abaixo funciona bem.
java.sql.Date date = new java.sql.Date(pickedDate.getDate().getTime());
onde pickingDate é objeto de JXDatePicker
fonte
Essa função retornará uma data SQL convertida do objeto de data java.
fonte
Formate seu java.util.Date primeiro. Em seguida, use a data formatada para obter a data em java.sql.Date
fonte
Aqui o exemplo de conversão de Data do Util para Data do SQL e esse é um exemplo que eu estou usando no meu projeto. Também pode ser útil para você.
fonte
Eu sou um novato: depois de muito correr isso funcionou. O pensamento pode ser útil
fonte
java.util.Date
,java.util.Calendar
ejava.text.SimpleDateFormat
estão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .Aqui javaDate é a instância de java.util.Date
fonte
Método para comparar 2 datas (util.date ou sql.date)
fonte
tente com isso
fonte
Eu acho que a melhor maneira de converter é:
Se você deseja inserir a
dt
variável em uma tabela SQL, você pode:fonte
Estou usando o código a seguir, por favor, experimente
especifique o formato da data que você deseja, por exemplo,
"DD-MM_YYYY"
ou'YYYY-mm-dd'
use o tipo de dados java Date comoentão ele analisará sua data
fonte
Você pode usar esse método para converter a data do utilitário em data do sql,
fonte
Eu estava tentando a seguinte codificação que funcionou bem.
fonte
Se você está usando o MySQL, uma coluna de data pode receber uma representação String dessa data
Então, eu usando a classe DateFormatter para formatá-lo e defini-lo como uma String na instrução sql ou instrução preparada
aqui está a ilustração do código:
Data da string = converUtilDateToSqlDate (otherTransaction.getTransDate ());
// passa essa data na sua instrução sql
fonte