Como armazenar data de Java em data e hora de Mysql com JPA

104

Qualquer corpo pode me dizer como posso armazenar data de Java para data e hora de Mysql ...?

Quando estou tentando fazer isso ... apenas a data é armazenada e a hora permanece 00:00:00 em armazenamentos de data Mysql assim ...

2009-09-22 00:00:00

Eu não quero apenas namorar, mas também tempo ... gosto

2009-09-22 08:08:11

Estou usando JPA (Hibernate) com classes de mydomain spring usa java.util.Date, mas criei tabelas usando consultas escritas à mão ...

esta é minha declaração de criação

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
fonte
pedaços de seu código, talvez?
Bozho
1
Hoje em dia, você não deveria mais usar java.util.Date(em 2010 provavelmente não havia escolha melhor). Melhor usar as classes modernas, como java.time.Instantou java.time.LocalDateTime, dependendo dos requisitos exatos para a data e hora que você precisa armazenar.
Ole VV
Algumas dessas respostas antigas aparecem muito bem no ranking do Google. No Java 8+, podemos simplesmente usar LocalDateTime para salvar data e hora em vez de recorrer ao uso de @Temporal para salvar no formato de data e hora
HopeKing
readyStatement.setTimestamp (1, novo Timestamp (System.currentTimeMillis ()));
Rajat

Respostas:

165

veja no link:

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

O código a seguir acabou de resolver o 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 ' foi inserido na coluna cujo tipo era DateTime e foi bem sucedido.

Haim Evgi
fonte
4
mas, currentTime é um objeto String, e em db tomamos datetime como tipo de dados, acho que não vai ser inserido. certo?
Reddy
yyyy-MM-dd HH:mm:ssé muito importante. Observe a capitalização.
biniam
91

Anote seu campo (ou getter) com @Temporal(TemporalType.TIMESTAMP), assim:

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

Isso deve funcionar.

Pascal Thivent
fonte
2
Esta é a resposta de fato!
Perneel de
2
para isso, esta é a resposta adequada.
Ryan
3
esteja ciente de que se você escolher esta solução, sua data aparecerá como um carimbo de data / hora quando obtida do banco de dados. Não terá a formatação agradável 'aaaa-MM-dd ....')
jon
37

Você talvez esteja usando java.sql.Date? Embora tenha granularidade de milissegundos como uma classe Java (é uma subclasse de java.util.Datemá decisão de design), será interpretada pelo driver JDBC como uma data sem um componente de tempo. Você tem que usar em seu java.sql.Timestamplugar.

Michael Borgwardt
fonte
1
Eu não usaria java.sql.Dateou java.sql.Timestampem classes de domínio, mas acho que isso foi escrito antes da edição do OP.
Pascal Thivent
Eu gostaria. Os objetos java.util.Date não se comparam aos objetos java.sql.Timestamp com resultados totalmente previsíveis.
Doug Moscrop
8

Provavelmente porque sua data java tem um formato diferente de mysql format( YYYY-MM-DD HH:MM:SS)

faça isso

 DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
 Date date = new Date();
 System.out.println(dateFormat.format(date));
Marcx
fonte
Você mencionou o formato correto na referência e, em seguida, usou o formato incorreto no código.
Merric Huffstutler
6

você obterá o 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
fonte
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
fonte
4
java.util.Date date = new Date();
Object param = new java.sql.Timestamp(date.getTime());    
preparedStatement.setObject(param);
Michigan
fonte
1

Use o seguinte código para inserir a data no MySQL. Em vez de alterar o formato de nossa data para atender aos requisitos do MySql, podemos ajudar o banco de dados a reconhecer nossa data definindo os STR_TO_DATE(?, '%l:%i %p')parâmetros.

Por exemplo, 12/03/2014 pode ser representado 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
fonte
1

É muito simples, embora as condições nesta resposta sejam em mysql, o tipo de dados da coluna é datetime e você deseja enviar dados do código Java para mysql:

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

importante é apenas escolher a data e seu formato já está no formato mysql e enviá-lo, sem mais modificações necessárias.

Yash Agrawal
fonte
0

Na verdade, você não pode usar SimpleDateFormat, você pode usar algo assim;

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

Desta forma, você pode obter diretamente a data com o formato especificado.

Sahin Yanlık
fonte
0

Eu ainda prefiro o método em uma linha

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

funciona para mim !!

na tabela mysql

DATETIME

na entidade:

private Date startDate;

em processo:

objectEntity.setStartDate(new Date());

na declaração preparada:

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