Come memorizzare Java Date in Mysql datetime con JPA


104

Qualcuno può dirmi come posso memorizzare Java Date su Mysql datetime ...?

Quando provo a farlo ... solo la data viene memorizzata e l'ora rimane 00:00:00 nei negozi di data Mysql come questo ...

2009-09-22 00:00:00

Voglio non solo la data ma anche l'ora ... mi piace

2009-09-22 08:08:11

Sto usando JPA (Hibernate) con le classi spring mydomain usa java.util.Date ma ho creato tabelle usando query scritte a mano ...

questa è la mia dichiarazione di creazione

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;

pezzi del tuo codice, forse?
Bozho


1
In questi giorni non dovresti più usarlo java.util.Date(nel 2010 probabilmente non c'era scelta migliore). Meglio usare le classi moderne, come java.time.Instanto java.time.LocalDateTime, a seconda dei requisiti esatti per la data e l'ora che devi memorizzare.
Ole VV

Alcune di queste vecchie risposte sono piuttosto alte nelle classifiche di Google. In Java 8+ possiamo semplicemente usare LocalDateTime per salvare datetime invece di ricorrere all'uso di @Temporal per salvare in formato datetime
HopeKing

readyStatement.setTimestamp (1, nuovo Timestamp (System.currentTimeMillis ()));
Rajat

Risposte:


165

vedere nel link:

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

Il codice seguente ha appena risolto il 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);

Questo " currentTime " è stato inserito nella colonna il cui tipo era DateTime ed è stato eseguito correttamente.


4
ma currentTime è un oggetto String e in db prendiamo datetime come tipo di dati, penso che non verrà inserito. giusto?
Reddy

yyyy-MM-dd HH:mm:ssè molto importante. Prendi nota delle maiuscole.
biniam

91

Annota il tuo campo (o getter) con @Temporal(TemporalType.TIMESTAMP), in questo modo:

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

Questo dovrebbe fare il trucco.


2
Questa è davvero la risposta!
Perneel

2
per questo, questa è la risposta corretta.
Ryan

3
tieni presente che se scegli questa soluzione, la tua data apparirà come un timestamp quando recuperata da db. Non avrà la bella formattazione 'aaaa-MM-gg ....')
jon

37

Stai forse usando java.sql.Date? Sebbene abbia una granularità millisecondo come classe Java (è una sottoclasse di una java.util.Datecattiva decisione di progettazione), verrà interpretata dal driver JDBC come una data senza un componente temporale. Devi usare java.sql.Timestampinvece.


1
Non userei java.sql.Dateo java.sql.Timestampin classi di dominio ma immagino che sia stato scritto prima della modifica dell'OP.
Pascal Thivent

Vorrei. Gli oggetti java.util.Date non vengono confrontati con gli oggetti java.sql.Timestamp con risultati completamente prevedibili.
Doug Moscrop

8

Probabilmente perché la tua data java ha un formato diverso da mysql format( YYYY-MM-DD HH:MM:SS)

Fai questo

 DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
 Date date = new Date();
 System.out.println(dateFormat.format(date));

Hai menzionato il formato corretto nel riferimento e poi hai utilizzato il formato sbagliato nel codice.
Merric Huffstutler

6

si otterrà 2011-07-18 + formato ora

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

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

4
java.util.Date date = new Date();
Object param = new java.sql.Timestamp(date.getTime());    
preparedStatement.setObject(param);

1

Usa il codice seguente per inserire la data in MySQL. Invece di modificare il formato della nostra data per soddisfare i requisiti di MySql, possiamo aiutare il database a riconoscere la nostra data impostando i STR_TO_DATE(?, '%l:%i %p')parametri.

Ad esempio, 2014-03-12 può essere rappresentato come 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'),?,?,?,?,?)"); 

1

È molto semplice anche se le condizioni in questa risposta sono in mysql il tipo di dati della colonna è datetime e si desidera inviare dati dal codice java a mysql:

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

l'importante è solo scegliere la data e il suo formato è già come il formato mysql e inviarlo, non sono necessarie ulteriori modifiche.


0

In realtà non puoi usare SimpleDateFormat, puoi usare qualcosa di simile;

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

In questo modo puoi ottenere direttamente la data con il formato specificato.


0

Preferisco ancora il metodo in una riga

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

-2

per me funziona !!

nella tabella mysql

DATETIME

nell'entità:

private Date startDate;

in corso:

objectEntity.setStartDate(new Date());

in readyStatement:

pstm.setDate(9, new java.sql.Date(objEntity.getStartDate().getTime()));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.