Como converter java.util.Date para java.sql.Date?

Eu estou tentando usar um java.util.Date como input e, em seguida, criando uma consulta com ele – então eu preciso de um java.sql.Date .

Fiquei surpreso ao descobrir que ele não poderia fazer a conversão de forma implícita ou explícita – mas eu nem sei como eu faria isso, já que a API Java ainda é relativamente nova para mim.

tl; dr

Como converter java.util.Date para java.sql.Date?

Não faça Ambas as classs estão fora de moda.

  • Use classs java.time em vez de legacy java.util.Date & java.sql.Date com JDBC 4.2 ou posterior.
  • Converter para / de 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 vez de java.util.Date
    Ambos representam um momento no UTC. mas agora com nanossegundos em vez de milissegundos.
  • LocalDate vez de java.sql.Date
    Ambos representam um valor somente de datas sem hora do dia e sem fuso horário.

Detalhes

Se você estiver tentando trabalhar com valores somente de datas (sem hora do dia, sem fuso horário), use a class LocalDate vez de java.util.Date .

java.time

No Java 8 e versões posteriores, as antigas classs problemáticas de data e hora empacotadas com versões anteriores do Java foram substituídas pelo novo pacote java.time . Veja o Oracle Tutorial . Grande parte da funcionalidade foi transferida para o Java 6 e 7 no ThreeTen-Backport e adaptada para o Android no ThreeTenABP .

Um tipo de dados SQL DATE deve ser apenas de data, sem hora do dia nem fuso horário. Java nunca teve exatamente essa class † até java.time.LocalDate em Java 8. Vamos criar um valor como esse, 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 se inicia em Paris) do que em Montréal, 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 estar prontos. Se seu driver JDBC estiver em conformidade com as especificações do JDBC 4.2 , você poderá passar um LocalDate via setObject em um 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 object Java LocalDate . Especificar a class no segundo argumento torna seu código seguro para o tipo .

 LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class ); 

Em outras palavras, toda essa questão é irrelevante sob o JDBC 4.2 ou posterior.

Se seu driver JDBC não for executado dessa maneira, você precisará voltar a converter para os tipos java.sql.

Converta em java.sql.Date

Para converter, use novos methods adicionados às antigas classs de data e hora. Podemos chamar java.sql.Date.valueOf(…) para converter uma 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 de classs antigas de data e hora, você pode ser forçado a trabalhar com códigos existentes. Se assim for, você pode converter de / para java.time.

Percorra a class Instant , que representa um momento na linha do tempo no UTC. Um Instant é semelhante na ideia para um java.util.Date . Mas observe que o Instant tem uma resolução de até nanossegundos, enquanto o java.util.Date tem resolução de apenas milissegundos .

Para converter, use novos methods adicionados às classs 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. Para qualquer momento, a data varia ao redor do globo por fuso horário. Aplique um ZoneId para obter um ZonedDateTime .

 ZoneId zoneId = ZoneId.of ( "America/Montreal" ); ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId ); LocalDate localDate = zdt.toLocalDate(); 

† A class java.sql.Date finge ser apenas de data sem hora do dia, mas na verdade faz uma hora do dia, ajustada para a hora da meia-noite. Confuso? Sim, as antigas classs de data e hora são uma bagunça.


Sobre o java.time

O framework java.time está embutido no Java 8 e posterior. Essas classs substituem as antigas classs herdadas de data e hora legadas , como java.util.Date , Calendar e SimpleDateFormat .

O projeto Joda-Time , agora em modo de manutenção , aconselha a migration para as classs java.time .

Para saber mais, veja o Oracle Tutorial . E pesquise o Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .

Você pode trocar objects java.time diretamente com seu database. Use um driver JDBC compatível com o JDBC 4.2 ou posterior. Não há necessidade de strings, não há necessidade de classs java.sql.* .

Onde obter as classs java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 e posterior
    • Construídas em.
    • Parte da API Java padrão com uma implementação integrada.
    • O Java 9 adiciona alguns resources e correções menores.
  • Java SE 6 e Java SE 7
    • Grande parte da funcionalidade java.time é transferida para o Java 6 e 7 no ThreeTen-Backport .
  • Android
    • Versões posteriores das implementações do pacote Android das classs java.time .
    • Para Android anterior (<26), o projeto ThreeTenABP adapta o ThreeTen-Backport (mencionado acima). Veja Como usar o ThreeTenABP… .

O projeto ThreeTen-Extra estende java.time com classs adicionais. Este projeto é um campo de testes para possíveis futuras adições ao java.time. Você pode encontrar algumas classs úteis aqui como Interval , YearWeek , YearQuarter e muito mais .

Deixa pra lá….

 public class MainClass { public static void main(String[] args) { java.util.Date utilDate = new java.util.Date(); java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); System.out.println("utilDate:" + utilDate); System.out.println("sqlDate:" + sqlDate); } } 

explica isso. O link é http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm

Com a outra resposta, você pode ter problemas com as informações de tempo (compare as datas com resultados inesperados!)

Eu sugiro:

 java.util.Calendar cal = Calendar.getInstance(); java.util.Date utilDate = new java.util.Date(); // your util date cal.setTime(utilDate); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); java.sql.Date sqlDate = new java.sql.Date(cal.getTime().getTime()); // your sql date System.out.println("utilDate:" + utilDate); System.out.println("sqlDate:" + sqlDate); 

Essa function retornará uma data SQL convertida do object de data java.

 public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) { return new java.sql.Date(date.getTime()); } 

A conversão de java.util.Data para java.sql.Data perderá a hora, o minuto e o segundo. Então, se for possível, sugiro que você use java.sql.Timestamp assim:

 prepareStatement.setTimestamp(1, new Timestamp(utilDate.getTime())); 

Para mais informações, você pode verificar essa questão .

No meu caso de escolher data de JXDatePicker (java calendar) e obtê-lo armazenado no database como tipo de data SQL, abaixo funciona bem ..

java.sql.Date date = new java.sql.Date(pickedDate.getDate().getTime());

onde pickedDate é object de JXDatePicker

Essa function retornará uma data SQL convertida do object de data java.

 public static java.sql.Date convertFromJAVADateToSQLDate( java.util.Date javaDate) { java.sql.Date sqlDate = null; if (javaDate != null) { sqlDate = new Date(javaDate.getTime()); } return sqlDate; } 

Formate seu java.util.Date primeiro. Em seguida, use a data formatada para obter a data em java.sql.Date

 java.util.Date utilDate = "Your date" SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); final String stringDate= dateFormat.format(utilDate); final java.sql.Date sqlDate= java.sql.Date.valueOf(stringDate); 

Aqui, o exemplo da conversão da Data do Util para data do Sql e ya, este é um exemplo que eu estou usando no meu projeto pode ser útil para você também.

 java.util.Date utilStartDate = table_Login.getDob();(orwhat ever date your give form obj) java.sql.Date sqlStartDate = new java.sql.Date(utilStartDate.getTime());(converting date) 

Eu sou um novato: depois de muita correria isso funcionou. O pensamento pode ser útil

  String bufDt = bDOB.getText(); //data from form DateFormat dF = new SimpleDateFormat("dd-MM-yyyy"); //data in form is in this format Date bbdt = (Date)dF.parse(bufDt); // string data is converted into java util date DateFormat dsF = new SimpleDateFormat("yyyy-MM-dd"); //converted date is reformatted for conversion to sql.date String ndt = dsF.format(bbdt); // java util date is converted to compatible java sql date java.sql.Date sqlDate= java.sql.Date.valueOf(ndt); // finally data from the form is convered to java sql. date for placing in database 

Método para comparar 2 datas (util.date ou sql.date)

  public static boolean isSameDay(Date a, Date b) { Calendar calA = new GregorianCalendar(); calA.setTime(a); Calendar calB = new GregorianCalendar(); calB.setTime(b); final int yearA = calA.get(Calendar.YEAR); final int monthA = calA.get(Calendar.MONTH); final int dayA = calA.get(Calendar.DAY_OF_YEAR); final int yearB = calB.get(Calendar.YEAR); final int monthB = calB.get(Calendar.MONTH); final int dayB = calB.get(Calendar.DAY_OF_YEAR); return yearA == yearB && monthA == monthB && dayA == dayB; } 

tente com isso

 public static String toMysqlDateStr(Date date) { String dateForMySql = ""; if (date == null) { dateForMySql = null; } else { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dateForMySql = sdf.format(date); } return dateForMySql; } 

Eu acho que a melhor maneira de converter é:

 static java.sql.Timestamp SQLDateTime(Long utilDate) { return new java.sql.Timestamp(utilDate); } Date date = new Date(); java.sql.Timestamp dt = SQLDateTime(date.getTime()); 

Se você quiser inserir a variável dt em uma tabela SQL, você pode fazer:

 insert into table (expireAt) values ('"+dt+"'); 

Eu estou usando o seguinte código, por favor, experimente

 DateFormat fm= new SimpleDateFormatter(); 

especifique o formato da data desejada, por exemplo, "DD-MM_YYYY" ou 'YYYY-mm-dd' seguida, use o tipo de dados java Date como

 fm.format("object of java.util.date"); 

então vai analisar sua data

Você pode usar este método para converter a data de uso para a data de sql,

 DateUtilities.convertUtilDateToSql(java.util.Date) 

Eu estava tentando a seguinte codificação que funcionou bem.

java.util.Date utilDate = new java.util.Date ();
java.sql.Date sqlDate = new java.sql.Date (utilDate);

Se você está usando mysql, uma coluna de data pode ser passada por uma representação de string dessa data

então eu usando a class DateFormatter para formatá-lo e, em seguida, defini-lo como uma String na instrução sql ou instrução preparada

aqui está a ilustração do código:

 private String converUtilDateToSqlDate(java.util.Date utilDate) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String sqlDate = sdf.format(utilDate); return sqlDate; } 

String data = converUtilDateToSqlDate (otherTransaction.getTransDate ());

// então passe essa data na sua instrução sql