2009-02-09 32 views
369

Estoy tratando de usar un java.util.Date como entrada y luego crear una consulta con él, así que necesito un java.sql.Date.Cómo convertir java.util.Date a java.sql.Date?

Me sorprendí al descubrir que no podía hacer la conversión implícita o explícitamente, pero ni siquiera sé cómo haría esto, ya que la API de Java todavía es bastante nueva para mí.

+0

se puede encontrar un problema similar aquí http://stackoverflow.com/questions/12131068/error-casting-java-util-date -into-java-sql-date – Lem

+0

Para mí, resultó que no necesitaba convertir. Había un 'import java.sql. *' En mi código, anulando java.util.date y causando problemas al asignar valores de fecha que estaban bien con este último pero no con el primero. HTH – HumanInDisguise

+1

@DavidAckerman ¿Entiende que un java.util.Date es una fecha * y * una hora del día, pero un java.sql.Date es solo una fecha * sin * una hora del día? (En realidad, hay una hora del día, pero eso se ignora, un truco defectuoso de un diseño de clase). En SQL, 'DATE' significa fecha solamente. –

Respuesta

26

tl; dr

  • Uso java.time clases en lugar de legado java.util.Date & java.sql.Date con JDBC 4.2 o posterior.
  • Convierta a/desde java.time si está funcionando con código aún no actualizado a java.time.

Consulta de ejemplo con 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. 
) 

detalles

Si usted está tratando de trabajar con valores de fecha de sólo (no, no zona horaria de hora del día), utilice la clase LocalDate en lugar de java.util.Date.

java.time

En Java 8 y versiones posteriores, las clases de fecha y hora viejas problemáticas que vienen con las primeras versiones de Java han sido suplantada por la nueva java.time package. Ver Oracle Tutorial. Gran parte de la funcionalidad se ha retrotraído a Java 6 & 7 en ThreeTen-Backport y adaptada a Android en ThreeTenABP.

A SQL data typeDATE está destinado a ser solo de fecha, sin hora del día ni zona horaria. Java nunca tuvo precisamente dicha clase † hasta el java.time.LocalDate en Java 8. Creemos ese valor obteniendo la fecha de hoy de acuerdo con un huso horario particular (la zona horaria es importante para determinar una fecha como un nuevo día amanece antes en París que en Montreal, por ejemplo).

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". 

En este punto, podemos estar listos. Si su JDBC driver cumple con JDBC 4.2 spec, debe poder pasar un LocalDate a través de setObject en un PreparedStatement para almacenar en un campo de FECHA SQL.

myPreparedStatement.setObject(1 , localDate); 

mismo modo, utilizar ResultSet::getObject a buscar a partir de una columna FECHA SQL a un LocalDate objeto Java. Al especificar la clase en el segundo argumento, aparece el código type-safe.

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

En otras palabras, toda esta pregunta es irrelevante bajo JDBC 4.2 o posterior.

Si su controlador JDBC no funciona de esta manera, debe recurrir a la conversión a los tipos java.sql.

Convertir a java.sql.Date

Para convertir, utilizan los nuevos métodos añadidos a las clases de fecha y hora de edad. Podemos llamar al java.sql.Date.valueOf(…) para convertir un LocalDate.

java.sql.Date sqlDate = java.sql.Date.valueOf(todayLocalDate); 

Y yendo en la otra dirección.

LocalDate localDate = sqlDate.toLocalDate(); 

La conversión de java.util.Date

Mientras que usted debe evitar el uso de las clases de fecha y hora de edad, se verá forzado a la hora de trabajar con el código existente. Si es así, puede convertir a/desde java.time.

Pase por la clase Instant, que representa un momento en la línea de tiempo en UTC. Un Instant es similar en idea a un java.util.Date. Pero tenga en cuenta que Instant tiene una resolución de hasta nanoseconds, mientras que java.util.Date tiene solo milliseconds de resolución.

Para convertir, use los métodos nuevos agregados a las clases antiguas. Por ejemplo, java.util.Date.from(Instant) y java.util.Date::toInstant.

Instant instant = myUtilDate.toInstant(); 

Para determinar una fecha, necesitamos el contexto de una zona horaria. Para cualquier momento dado, la fecha varía alrededor del mundo por zona horaria. Aplique un ZoneId para obtener un ZonedDateTime.

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

† La clase java.sql.Date pretende ser de sólo fecha sin la hora del día, pero en realidad hace una hora del día, ajustado a un tiempo la medianoche. ¿Confuso? Sí, las viejas clases de fecha y hora son un desastre.

421

importa ....

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); 

    } 

} 

lo explica. El enlace es http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm

+33

¡Esto no es una conversión explícita! Desde Javadoc: "Si el valor de milisegundos proporcionado contiene información de tiempo, el controlador establecerá los componentes de tiempo a la hora en la zona horaria predeterminada (la zona horaria de la máquina virtual Java que ejecuta la aplicación) que corresponde a cero GMT." Así que no importa cuál sea su tiempo en su java.util.Date, se insertará como 00:00:00 en una columna con el tipo de datos configurado en FECHA. –

+1

@David Ackerman ..... este método devuelve el 'epochseconds', es decir, milisegundos después del' 1, ENE, 1970'. Pero, ¿y si queremos almacenar la fecha de una persona antes de esta fecha ... o algo así como '0000-00-00 por defecto? –

+28

En mi caso, la respuesta correcta es java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(utilDate.getTime());, porque conserva los campos de tiempo. –

36

Con la otra respuesta es posible que tenga problemas con la información en tiempo

que sugieren (comparar las fechas con resultados inesperados!):

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); 
+5

Si usa java.sql.Date para una columna de fecha en una base de datos, esa información de tiempo se truncará. Ha sopesado la solución en mi opinión. – darioo

+4

Sí, tal vez lo hice. A veces necesito comparar el java.sql.Data con la fecha actual y esta es la mejor manera. Espero que pueda ayudar. – mauretto

-8

Si se usgin Mysql una fecha la columna se puede pasar una representación de cadena de esta fecha

por lo que estoy usando la clase DateFormatter para formatearla y luego configurarla como una cadena en la instrucción SQL o en la declaración preparada

aquí es la ilustración de código:

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

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

// luego pasar esta fecha en que la declaración de sql

+12

Bienvenido a stackoverflow, tengo algunos comentarios a su respuesta. La pregunta era "cómo convertir un java.util.Date a java.sql.Date". El código que pegó da formato a java.util.Date como aaaa-MM-dd. En realidad, este uso es limitado en este contexto, ya que debe pasar el java.sql.Date directamente a los controladores jdbc en lugar de hacerlo como una cadena. – jontro

1

método para comparar 2 fechas (util.date o 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; 
} 
2

Aquí el ejemplo de la conversión Util Fecha hasta la fecha SQL y este es un ejemplo de lo que estoy usando en mi proyecto también podría ser útil para usted.

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) 
0

tratar con este

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; 
} 
-3

estoy usando el siguiente código favor probarlo

DateFormat fm= new SimpleDateFormatter(); 

especificar el formato de la fecha en que desea por ejemplo "DD-MM_YYYY" o 'YYYY-mm-dd' luego usar el tipo de datos de Fecha de Java como

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

luego analizará su fecha

19

Esta función devolverá una fecha SQL convertida del objeto java date.

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

Esta función devolverá una fecha SQL convertida del objeto java date.

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; 
    } 
-3

Puede utilizar este método para convertir la fecha util hasta la fecha sql,

DateUtilities.convertUtilDateToSql(java.util.Date) 
+0

No hay clase DateUtilities en la biblioteca estándar de Java (y no puedo encontrar este método en ningún sitio desde una búsqueda rápida en Google). Si esto proviene de una biblioteca específica, es posible que desee decirlo e incluir un enlace a los documentos. – Dukeling

15

conversión de java.util.Data a java.sql.Data habrá perdido la hora, minuto y segundo. Así que si es posible, le sugiero que utilice java.sql.Timestamp así:

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

Para obtener más información, se puede comprobar this question.

3

Formatea primero tu java.util.Date. A continuación, utilice la fecha formateada para obtener la fecha en 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); 
-1

Creo que la mejor manera de convertir es:

static java.sql.Timestamp SQLDateTime(Long utilDate) { 
    return new java.sql.Timestamp(utilDate); 
} 

Date date = new Date(); 
java.sql.Timestamp dt = SQLDateTime(date.getTime()); 

Si desea insertar la variable dt en una tabla de SQL usted puede hacer:

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

Esto parece ser esencialmente el mismo que [esta respuesta] (https://stackoverflow.com/a/31237429/1711796) publicado un año antes. – Dukeling

1

Soy un novato: después de correr mucho alrededor de esto funcionó. El pensamiento podría 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 
-3

Estaba probando la siguiente codificación que funcionó bien.

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

7

En mi caso de escoger la fecha de JXDatePicker (java calandria) y conseguir que se almacene en la base de datos como tipo de fecha SQL, a continuación funciona bien ..

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

donde pickedDate es objeto de JXDatePicker

Cuestiones relacionadas