Cómo almacenar Java Date en Mysql datetime con JPA

104

¿Alguien puede decirme cómo puedo almacenar Java Date en Mysql datetime ...?

Cuando intento hacerlo ... solo se almacena la fecha y el tiempo permanece 00:00:00 en las tiendas de fechas de Mysql como esta ...

2009-09-22 00:00:00

Quiero no solo una cita, sino también una hora ... como

2009-09-22 08:08:11

Estoy usando JPA (Hibernate) con las clases de midominio de primavera que usan java.util.Date pero he creado tablas usando consultas escritas a mano ...

esta es mi declaración de creación

CREATE TABLE ContactUs (id BIGINT auto_increment, 
                        userName VARCHAR(30), 
                        email VARCHAR(50), 
                        subject VARCHAR(100), 
                        message VARCHAR(1024), 
                        messageType VARCHAR(15), 
                        contactUsTime datetime, 
                        primary key(id))
                        TYPE=InnoDB;
Urvish
fuente
fragmentos de su código, tal vez?
Bozho
1
En estos días ya no debería usar java.util.Datenada (en 2010 probablemente no había una mejor opción). Es mejor usar las clases modernas, como java.time.Instanto java.time.LocalDateTime, dependiendo de los requisitos exactos para la fecha y hora que necesita almacenar.
Ole VV
Algunas de estas viejas respuestas aparecen bastante altas en las clasificaciones de Google. En Java 8+, simplemente podemos usar LocalDateTime para guardar la fecha y hora en lugar de recurrir a usar @Temporal para guardar en formato de fecha y hora
HopeKing
prepareStatement.setTimestamp (1, nueva marca de tiempo (System.currentTimeMillis ()));
Rajat

Respuestas:

165

ver en el enlace:

http://www.coderanch.com/t/304851/JDBC/java/Java-date-MySQL-date-conversion

El siguiente código acaba de resolver el problema:

java.util.Date dt = new java.util.Date();

java.text.SimpleDateFormat sdf = 
     new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String currentTime = sdf.format(dt);

Este ' currentTime ' se insertó en la columna cuyo tipo era DateTime y fue exitoso.

Haim Evgi
fuente
4
pero, currentTime es un objeto String, y en db tomamos datetime como tipo de datos, creo que no se insertará, ¿verdad?
Reddy
yyyy-MM-dd HH:mm:sses muy importante. Tome nota de las mayúsculas.
Biniam
91

Anote su campo (o getter) con @Temporal(TemporalType.TIMESTAMP), así:

public class MyEntity {
    ...
    @Temporal(TemporalType.TIMESTAMP)
    private java.util.Date myDate;
    ...
}

Eso debería hacer el truco.

Pascal Thivent
fuente
2
¡Esta es la respuesta!
Perneel
2
para esto, esta es la respuesta adecuada.
Ryan
3
tenga en cuenta que si elige esta solución, su fecha aparecerá como una marca de tiempo cuando se obtenga de db. No tendrá el formato agradable 'aaaa-MM-dd ....')
jon
37

¿Quizás estás usando java.sql.Date? Si bien tiene una granularidad de milisegundos como una clase de Java (es una subclase de una java.util.Datemala decisión de diseño), el controlador JDBC lo interpretará como una fecha sin un componente de hora. Tienes que usar java.sql.Timestampen su lugar.

Michael Borgwardt
fuente
1
No usaría java.sql.Dateo java.sql.Timestampen clases de dominio, pero supongo que esto se escribió antes de la edición del OP.
Pascal Thivent
Me gustaría. Los objetos java.util.Date no se comparan con los objetos java.sql.Timestamp con resultados completamente predecibles.
Doug Moscrop
8

Probablemente porque su fecha de Java tiene un formato diferente de mysql format(YYYY-MM-DD HH:MM:SS )

hacer esto

 DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
 Date date = new Date();
 System.out.println(dateFormat.format(date));
Marcx
fuente
Mencionaste el formato correcto en la referencia y luego usaste el formato incorrecto en el código.
Merric Huffstutler
6

obtendrá el formato de hora 2011-07-18 +

long timeNow = Calendar.getInstance().getTimeInMillis();
java.sql.Timestamp ts = new java.sql.Timestamp(timeNow);
...
preparedStatement.setTimestamp(TIME_COL_INDEX, ts);
Anuj
fuente
5

mysql datetime -> GregorianCalendar

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse("2012-12-13 14:54:30"); // mysql datetime format
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
System.out.println(calendar.getTime());

GregorianCalendar -> mysql datetime

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String string = format.format(calendar.getTime());
System.out.println(string);
Nikopol
fuente
4
java.util.Date date = new Date();
Object param = new java.sql.Timestamp(date.getTime());    
preparedStatement.setObject(param);
michdraft
fuente
1

Utilice el siguiente código para insertar la fecha en MySQL. En lugar de cambiar el formato de nuestra fecha para cumplir con los requisitos de MySql, podemos ayudar a la base de datos a reconocer nuestra fecha configurando elSTR_TO_DATE(?, '%l:%i %p') parámetros.

Por ejemplo, 2014-03-12 se puede representar como STR_TO_DATE('2014-03-12', '%Y-%m-%d')

preparedStatement = connect.prepareStatement("INSERT INTO test.msft VALUES (default, STR_TO_DATE( ?, '%m/%d/%Y'), STR_TO_DATE(?, '%l:%i %p'),?,?,?,?,?)"); 
Yang_2333
fuente
1

Es muy simple, aunque las condiciones en esta respuesta están en mysql, el tipo de datos de la columna es datetime y desea enviar datos desde el código java a mysql:

java.util.Date dt = new java.util.Date ();
whatever your code object may be.setDateTime (dt);

Lo importante es solo elegir la fecha y su formato ya es el formato mysql y enviarlo, no se requieren más modificaciones.

Yash Agrawal
fuente
0

En realidad, no puede usar SimpleDateFormat, puede usar algo como esto;

  @JsonSerialize(using=JsonDateSerializer.class)
  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy HH:mm:ss")
  private Date blkDate;

De esta manera, puede obtener directamente la fecha con el formato especificado.

Sahin Yanlık
fuente
0

Todavía prefiero el método en una línea

new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime())
Mohannd
fuente
-2

esto funciona para mi !!

en la tabla mysql

DATETIME

en entidad:

private Date startDate;

en proceso:

objectEntity.setStartDate(new Date());

en estado preparado:

pstm.setDate(9, new java.sql.Date(objEntity.getStartDate().getTime()));
Miguel Alonso Mosquera Aguilar
fuente