Cómo convertir java.útil.Fecha a Java.SQL.¿Cita?


Estoy tratando de usar un java.util.Date como entrada y luego crear una consulta con ella-así que necesito un java.sql.Date.

Me sorprendió 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í.

Author: Basil Bourque, 2009-02-10

17 answers

Tl; dr

Cómo convertir java.útil.Fecha a Java.SQL.¿Cita?

Ambas clases están anticuadas.

  • Uso java.hora clases en lugar de legacy java.util.Date & java.sql.Date con JDBC 4.2 o posterior.
  • Convertir a/desde java.tiempo si interfiere con código aún no actualizado a Java.tiempo.

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

Reemplazos:

  • Instant en lugar de java.util.Date
    Ambos representan un momento en UTC. pero ahora con nanosegundos en lugar de milisegundos.
  • LocalDate en lugar de java.sql.Date
    Ambos representan un valor de solo fecha sin una hora del día y sin una zona horaria.

Detalles

Si está tratando de trabajar con valores de solo fecha (sin hora del día, sin zona horaria), utilice el LocalDate clase en lugar de java.util.Date.

Java.time

En Java 8 y posteriores, las problemáticas antiguas clases de fecha y hora incluidas con las primeras versiones de Java han sido suplantadas por la nueva java.time package . Ver Oracle Tutorial. Gran parte de la funcionalidad ha sido adaptada a Java 6 y 7 en ThreeTen-Backport y adaptada a Android en ThreeTenABP.

A Tipo de datos SQL DATE está destinado a ser solo fecha, sin hora del día y no hay zona horaria. Java nunca tuvo precisamente tal clase† hasta java.time.LocalDate en Java 8. Vamos a crear tal valor obteniendo la fecha de hoy de acuerdo con una zona horaria en particular (la zona horaria es importante para determinar una fecha ya que 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 haber terminado. Si su controlador JDBC cumple con JDBC 4.2 spec , debería poder pasar un LocalDate a través de setObject on a PreparedStatement para almacenar en un campo de fecha SQL.

myPreparedStatement.setObject( 1 , localDate );

Del mismo modo, use ResultSet::getObject para obtener desde una columna de fecha SQL a un objeto Java LocalDate. Especificar la clase en el segundo argumento hace que su código sea de tipo seguro.

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 volver a convertir a java.SQL tipo.

Convertir a java.SQL.Fecha

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

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

Y yendo en la otra dirección.

LocalDate localDate = sqlDate.toLocalDate();

Convirtiendo de java.util.Date

Si bien debe evitar el uso de las antiguas clases de fecha y hora, puede verse obligado a hacerlo cuando trabaje con código existente. Si es así, puede convertir a / desde java.tiempo.

Pasar por la clase Instant, que representa una 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 nanosegundos mientras que java.util.Date tiene solo milisegundos resolución.

Para convertir, utilice nuevos métodos añadidos 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 en todo el mundo por zona horaria. Aplicar una ZoneId para conseguir un ZonedDateTime.

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

† El java.SQL.La clase Date pretende ser solo fecha sin una hora del día, pero en realidad hace una hora del día, ajustada a una hora de medianoche. Confuso? Sí, las viejas clases de fecha y hora son un desastre.


Acerca de java.time

El java.hora el framework está integrado en Java 8 y versiones posteriores. Estas clases suplantan a las problemáticas antiguas legacy clases de fecha y hora como java.util.Date, Calendar, & SimpleDateFormat.

El Joda-Tiempo project, ahora en modo de mantenimiento , aconseja la migración a java .time clases.

Para obtener más información, consulte el Oracle Tutorial. Y desbordamiento de pila de búsqueda para muchos ejemplos y explicaciones. La especificación es JSR 310.

Puede intercambiar java.time objetos directamente con su base de datos. Use un Controlador JDBCcompatible con JDBC 4.2 o posterior. No hay necesidad de cadenas, no hay necesidad de clases java.sql.*.

Dónde obtener el java.clases de tiempo?

El ThreeTen-Extra el proyecto extiende java.tiempo con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a Java.tiempo. Usted puede encontrar algunos de clases útiles aquí, tales como Interval, YearWeek, YearQuarter, y más.

 40
Author: Basil Bourque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-03 18:30:15

No 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

 444
Author: David Ackerman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-09 21:18:40

Con la otra respuesta puede tener problemas con la información de tiempo (compare las fechas con resultados inesperados!)

Sugiero:

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);
 38
Author: mauretto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-22 06:38:47

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

public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) {
    return new java.sql.Date(date.getTime());
}
 23
Author: chetan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-18 15:50:13

Convertir java.util.Data a java.sql.Data perderá la hora,el minuto y el segundo. Así que si es posible, te sugiero que uses java.sql.Timestamp así:

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

Para más información, puede consultar esta pregunta.

 17
Author: shellbye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:28

En mi caso de elegir la fecha de JXDatePicker (calendario java) y almacenarla 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

 11
Author: jack jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-09 14:20:33

Esta función devolverá una fecha SQL convertida desde el 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;
    }
 5
Author: Tanmay kumar shaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-23 10:49:22

Formatee su java.útil.Cita primero. A continuación, utilice la fecha formateada para obtener la fecha en Java.SQL.Fecha

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);
 3
Author: hackfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-16 14:58:54

Aquí el ejemplo de convertir Util Date a Sql date y ya este es un ejemplo de lo que estoy usando en mi proyecto podría ser útil para usted también.

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)
 2
Author: Krishna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-24 10:40:02

Soy un novato: después de mucho correr 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
 2
Author: PKSawmy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-27 08:15:24

Método para comparar 2 fechas (util.fecha o sql.fecha)

 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;
}
 1
Author: Donovan Thomson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-14 08:38:34

Intenta con esto

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;
}
 0
Author: kapil das,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-04 12:48:20

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 SQL, puede hacer:

insert into table (expireAt) values ('"+dt+"');
 -1
Author: user6043502,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-23 17:35:55

Estoy usando el siguiente código por favor pruébelo

DateFormat fm= new SimpleDateFormatter();

Especifique el formato de la fecha que desea por ejemplo "DD-MM_YYYY" o 'YYYY-mm-dd' luego use el tipo de datos java Date como

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

Entonces analizará su fecha

 -3
Author: UmeshA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-12 18:40:12

Puede usar este método para convertir util date a sql date,

DateUtilities.convertUtilDateToSql(java.util.Date)
 -3
Author: Emmanuel Angelo.R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-02 05:58:04

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

Java.útil.Date utilDate = new java.útil.Date ();
java.SQL.Fecha sqlDate = nuevo java.SQL.Fecha (utilDato);

 -4
Author: PONRAJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-26 12:03:36

Si está usando Mysql, se puede pasar una columna de fecha una representación de cadena de esta fecha

Así que uso la clase DateFormatter para formatearla y luego la establezco como una cadena en la instrucción sql o la instrucción preparada

Aquí está la ilustración del código:

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

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

/ / luego pase esta fecha en su instrucción sql

 -8
Author: Benjamin Ndugga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-25 21:36:52