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;

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.


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.


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.


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

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

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

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'),?,?,?,?,?)"); 

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.


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.


0

Eu ainda prefiro o método em uma linha

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

-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()));
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.