Estoy tratando de usar un java.util.Fecha como entrada y, a continuación, crear una consulta con él – así que necesito un java.sql.Fecha.

Me sorprendió ver que no podía hacer la conversión implícita o explícitamente – pero yo no sé ni cómo iba a hacerlo, ya que la API de Java es todavía bastante nuevo para mí.

  • Usted puede encontrar un problema similar aquí stackoverflow.com/questions/12131068/…
  • Para mí, resultó que no me necesitaba para convertir. Hubo un import java.sql.* en mi código, reemplazando el java.util.fecha y causando problemas a la hora de asignar los valores de fecha que estaban bien con el último pero no el primero. HTH
  • ¿Entiende usted que un java.util.La fecha es una fecha y una hora del día, pero un java.sql.La fecha es sólo una fecha sin la hora del día? (En realidad hay un momento del día, pero que se ignora, una mala hack de un diseño de clase) En SQL, DATE significa la fecha-sólo.
  • Yo a la verdad no era consciente de los matices en el ’09, y dado que esta pregunta es tan popular, he cambiado la aceptó contestar a uno que sea más moderno y completo. Gracias a todos por sus aportes!

18 Comentarios

  1. 60

    tl;dr

    Cómo convertir java.util.Fecha de java.sql.Fecha?

    No. Ambas clases están pasadas de moda.

    • Uso java.tiempo clases en lugar de legado java.util.Date & java.sql.Date con JDBC 4.2 o posterior.
    • Convertir a/desde java.tiempo si inter-operar con código aún no se han actualizado a java.tiempo.

    Ejemplo de consulta 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
      representar un momento en UTC. pero ahora, con nanosegundos en lugar de milisegundos.
    • LocalDate en lugar de java.sql.Date
      Ambos representan una fecha valor solo sin un momento del día y sin zona horaria.

    Detalles

    Si usted está tratando de trabajar con la fecha-sólo los valores (no hay hora del día, sin zona horaria), el uso de la LocalDate clase en lugar de java.util.Fecha.

    Cómo convertir java.util.Fecha de java.sql.Fecha?

    java.tiempo

    En Java 8 y versiones posteriores, la problemática de edad fecha de clases de tiempo liado con las primeras versiones de Java han sido suplantada por la nueva java.paquete de tiempo. Ver Oracle Tutorial. Gran parte de la funcionalidad ha sido nuevamente trasladado a Java 6 & 7 en ThreeTen-Backport y adaptado a Android en ThreeTenABP.

    Un El tipo de datos SQL DATE está destinado a ser la fecha sin la hora del día y sin zona horaria. Java nunca tuvo precisamente una clase† hasta java.tiempo.LocalDate en Java 8. Vamos a crear un valor por llegar la fecha del día en función de la zona horaria (time zone es importante en la determinación de 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, se puede hacer. Si su Controlador JDBC cumple con JDBC 4.2 especificación, usted debe ser capaz de pasar una LocalDate a través de setObject en un PreparedStatement para almacenar en un SQL campo de FECHA.

    myPreparedStatement.setObject( 1 , localDate );

    Igualmente, el uso conjunto de resultados::getObject para recuperar de un SQL columna de FECHA a un Java LocalDate objeto. La especificación de la clase en el segundo argumento es el que hace el código tipo de seguro.

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

    En otras palabras, toda esta Cuestión es irrelevante en virtud de JDBC 4.2 o más tarde.

    Si su controlador JDBC no se realice de esta manera, usted necesita para volver a caer a la conversión a la de java.los tipos sql.

    Convertir a java.sql.Fecha

    A convertir, el uso de nuevos métodos añadido a la fecha vieja clases de tiempo. Podemos llamar a java.sql.Fecha.valueOf(...) para convertir un LocalDate.

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

    Y van en la dirección opuesta.

    LocalDate localDate = sqlDate.toLocalDate();

    La conversión de java.util.Date

    Mientras que usted debe evitar el uso de la antigua fecha de clases de tiempo, usted puede ser obligado a cuando se trabaja con el código existente. Si es así, usted puede convertir a/desde java.tiempo.

    Ir a través de la Instant clase, que representa un momento en la línea de tiempo en UTC. Un Instant es similar en la idea de un java.util.Date. Pero tenga en cuenta que Instant tiene una resolución de hasta nanosegundos mientras java.util.Date sólo ha milisegundos resolución.

    A convertir, el uso de nuevos métodos añadido a la edad, las clases. Por ejemplo, java.util.Fecha.a partir de( Instantánea ) y java.util.Fecha::toInstant.

    Instant instant = myUtilDate.toInstant();

    Para determinar una fecha, tenemos el contexto de una zona horaria. Para un momento dado, la fecha varía en todo el mundo por el tiempo de la zona. Aplicar una ZoneId para obtener una ZonedDateTime.

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

    † Java.sql.Fecha de la clase pretende ser la fecha-sólo que sin una hora del día, pero en realidad hace una hora del día, ajustado a un tiempo de medianoche. Confuso? Sí, el viejo de fecha y hora de las clases son un desastre.


    Sobre java.tiempo

    La java.tiempo marco está construido en Java 8 y versiones posteriores. Estas clases suplantar la problemática de edad legado fecha y hora de las clases, tales como java.util.Fecha, Calendario, & SimpleDateFormat.

    La Joda-Time proyecto, ahora en el modo de mantenimiento, asesora de la migración a la java.tiempo clases.

    Para obtener más información, consulte la Oracle Tutorial. Y la búsqueda de Desbordamiento de Pila, hay muchos ejemplos y explicaciones. La especificación es JSR 310.

    Puede intercambiar java.tiempo objetos directamente con la base de datos. El uso de un Controlador JDBC compatible con JDBC 4.2 o más tarde. No hay necesidad para las cadenas, sin necesidad de java.sql.* clases.

    Dónde obtener el java.clases de tiempo?

    La ThreeTen-Extra proyecto se extiende java.tiempo con clases adicionales. Este proyecto es un terreno de prueba para posibles futuras incorporaciones a java.tiempo. Usted puede encontrar algunos de clases útiles aquí como Intervalo, YearWeek, YearQuarter, y más.

  2. 460

    Nevermind….

    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. El enlace es http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm

    • Esto no es una conversión explícita! Desde el Javadoc: «Si la milisegundos valor contiene información de hora, el conductor le conjunto de los componentes de tiempo de la hora en la zona horaria predeterminada (la zona horaria de la máquina virtual de Java que se ejecuta la aplicación) que corresponde a cero GMT.» Así que no importa lo que su tiempo en java.util.Fecha, que será insertado como 00:00:00 en una columna con el tipo de datos establecido hasta la FECHA.
    • Ackerman…..este método devuelve el epochseconds yo.e milisegundos después de 1,JAN,1970. Pero, ¿y si queremos almacenar la fecha de una persona antes de esta fecha….o algo como 0000-00-00 as default
    • En mi caso la respuesta correcta es <code>java.sql.Timestamp sqlTimestamp = new java.sql.La marca de tiempo(utilDate.getTime());</código de>, porque conserva los campos de tiempo.
    • Java long se pueden asignar números negativos, y que los números negativos en una Fecha.
    • Esto plantea la pregunta, ¿por qué hay dos diferentes Date objetos que son incompatibles como parte de java del diseño? No debe ser nombrado SQLDate o algo en lugar de Date?
    • Sí, el fecha antigua de tiempo de clases liado con las primeras versiones de Java son un desastre, mal diseñados, incluyendo algunos crudo hacks. Siempre que sea posible, trate de usar el nuevo java.marco de tiempo en Java 8 y versiones posteriores. Estas nuevas clases sustituir a los viejos. El java.clases de tiempo y la edad, las clases tienen algunos métodos de conveniencia para la conversión de ida y vuelta — útil mientras esperamos a que los controladores JDBC para ser actualizado directamente en utilizar la nueva de java.los tipos de tiempo.
    • muchas gracias a java.el tiempo va a comprobar en ella
    • Consulte mi nueva Respuesta en esta Pregunta de cómo el uso de java.tiempo. También la búsqueda de StackOverflow para muchos más ejemplos.
    • java.util.Fecha.getTime() no funciona antes de 1970!

  3. 38

    Con la otra respuesta puede tener problemas con la información en tiempo (comparar 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);
    • Si está utilizando java.sql.La fecha para una columna de Fecha en una base de datos, el tiempo que la información se truncará. Has overengineered la solución, en mi opinión.
    • Sí, tal vez lo hice. A veces siento necesidad de comparar el java.sql.De datos con la fecha actual y en mi humilde opinión esta es la mejor manera. Espero que pueda ayudar.
    • FYI, el terriblemente molesto antiguo de la fecha y la hora de las clases, tales como java.util.Date, java.util.Calendar, y java.text.SimpleDateFormat ahora legado, suplantado por el de java.tiempo clases construido en Java 8 y versiones posteriores. Consulte Tutorial Oracle.
    • Por supuesto, este tema fue de aproximadamente 10 años atrás, pre-java 8.
  4. 24

    Esta función devolverá un convertido de SQL fecha de java fecha de objetos.

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

    La conversión de java.util.Data a java.sql.Data perderá hora, minuto y segundo. Así, si es posible, le sugiero que utilice java.sql.Timestamp como este:

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

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

  6. 13

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

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

    donde pickedDate es objeto de JXDatePicker

  7. 5

    Esta función devolverá un convertido de SQL fecha de java fecha de objetos.

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

    Formato de la versión de java.util.Primera fecha. A continuación, utilice el formato de fecha 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);
  9. 2

    Aquí el ejemplo de la conversión de Util Fecha de Sql fecha y ya esta es un ejemplo de lo que estoy utilizando 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)
  10. 2

    Yo soy un novato: después de mucho correr alrededor de esto funcionó. Pensé que 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
    • FYI, el terriblemente molesto antiguo de la fecha y la hora de las clases, tales como java.util.Date, java.util.Calendar, y java.text.SimpleDateFormat ahora legado, suplantado por el de java.tiempo clases construido en Java 8 y versiones posteriores. Consulte Tutorial Oracle.
  11. 1

    Método para la comparación de las 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;
    }
  12. 1
    java.sql.Date sqlDate = new java.sql.Date(javaDate.getTime());

    Aquí javaDate es la instancia de java.util.Fecha

    • La verdad es que no parece añadir nada nuevo en comparación con las respuestas de David Ackerman, chetan y Tanmay kumar shaw, ¿no es así?
  13. 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;
    }
  14. -1

    Creo que la mejor manera de convertir:

    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 el dt variable en una tabla de SQL que usted puede hacer:

    insert into table (expireAt) values ('"+dt+"');
    • Este parece ser esencialmente el mismo como esta respuesta publicado un año antes.
  15. -3

    estoy usando el siguiente código por favor probarlo

    DateFormat fm= new SimpleDateFormatter();

    especificar el formato de la fecha en que desea
    por ejemplo "DD-MM_YYYY" o 'YYYY-mm-dd', a continuación, utilizar el java tipo de datos de Fecha como

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

    a continuación, se analizará su fecha

  16. -3

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

    DateUtilities.convertUtilDateToSql(java.util.Date)
    • No hay DateUtilities clase en el estándar de la biblioteca de Java (y ni siquiera puedo encontrar este método en cualquier lugar y en todas a partir de una rápida búsqueda en Google). Si esto es de una biblioteca específica, usted podría querer decir tanto y de incluir un enlace a la documentación.
  17. -4

    Yo estaba tratando de la siguiente codificación que funcionaba bien.

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

  18. -8

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

    así que el uso de la DateFormatter Clase a formato y, a continuación, establecer una Cadena de texto en la instrucción sql o declaración preparada

    aquí está el código de la ilustración:

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

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

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

    • Bienvenido a stackoverflow, tengo un par de comentarios a su respuesta. La pregunta era «¿cómo convertir un java.util.Fecha de java.sql.La fecha». El código que has pegado formatos de java.util.Fecha aaaa-MM-dd. Esto en realidad es de uso limitado en este contexto, pues se debe pasar a la de java.sql.Fecha directamente a los controladores jdbc en lugar de hacerlo como una cadena.

Dejar respuesta

Please enter your comment!
Please enter your name here