Как сохранить дату Java в Mysql datetime с помощью JPA

104

Может ли кто-нибудь сказать мне, как я могу сохранить дату Java в Mysql datetime ...?

Когда я пытаюсь это сделать ... сохраняется только дата, а время остается 00:00:00 в таких хранилищах дат Mysql ...

2009-09-22 00:00:00

Я хочу не только дату, но и время ... как

2009-09-22 08:08:11

Я использую JPA (Hibernate) с классами spring mydomain, использующими java.util.Date, но я создал таблицы, используя рукописные запросы ...

это мой оператор создания

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;
Урвиш
источник
куски вашего кода, возможно?
Божо
1
ссылка: coderanch.com/t/304851/JDBC/java/…
Haim Evgi 08
1
В наши дни вы вообще не должны использовать его java.util.Date(в 2010 году, вероятно, не было лучшего выбора). Лучше использовать современные классы, например java.time.Instantили java.time.LocalDateTime, в зависимости от точных требований к дате и времени, которые вам нужно хранить.
Ole VV
Некоторые из этих старых ответов занимают довольно высокие позиции в рейтинге Google. В Java 8+ мы можем просто использовать LocalDateTime для сохранения datetime вместо использования @Temporal для сохранения в формате datetime
HopeKing
prepareStatement.setTimestamp (1, новая отметка времени (System.currentTimeMillis ()));
Rajat

Ответы:

165

см. по ссылке:

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

Следующий код только что решил проблему:

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

Это « currentTime » было вставлено в столбец типа DateTime, и это было успешно.

Хаим Евги
источник
4
но currentTime - это объект String, а в db мы принимаем datetime как тип данных, я думаю, что он не будет вставлен. верно?
Редди
yyyy-MM-dd HH:mm:ssочень важно. Обратите внимание на заглавные буквы.
biniam
92

Аннотируйте свое поле (или получатель) @Temporal(TemporalType.TIMESTAMP), например:

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

Это должно делать свое дело.

Паскаль Тивент
источник
2
Это действительно ответ!
Perneel
2
для этого, это правильный ответ.
Райан
3
имейте в виду, что если вы выберете это решение, ваша дата будет отображаться как метка времени при получении из базы данных. Это не будет иметь красиво форматирование «гггг-ММ-дд ....»)
Йон
37

Вы, наверное, используете java.sql.Date? Хотя у этого класса Java есть миллисекунды (это подкласс java.util.Date, плохое дизайнерское решение), он будет интерпретирован драйвером JDBC как дата без компонента времени. java.sql.TimestampВместо этого вы должны использовать .

Майкл Боргвардт
источник
1
Я бы не стал использовать java.sql.Dateили java.sql.Timestampв доменных классах, но думаю, это было написано до редактирования OP.
Паскаль Тивент, 09
Я буду. Объекты java.util.Date не сравниваются с объектами java.sql.Timestamp с полностью предсказуемыми результатами.
Дуг Москроп
8

Вероятно потому, что ваша дата java имеет другой формат от mysql format(YYYY-MM-DD HH:MM:SS )

сделай это

 DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
 Date date = new Date();
 System.out.println(dateFormat.format(date));
Маркс
источник
Вы упомянули правильный формат в справочнике, а затем использовали неправильный формат в коде.
Меррик Хаффстатлер,
6

вы получите 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

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

Используйте следующий код, чтобы вставить дату в MySQL. Вместо изменения формата нашей даты в соответствии с требованиями MySql мы можем помочь базе данных распознать нашу дату, установив параметрSTR_TO_DATE(?, '%l:%i %p') параметры.

Например, 2014-03-12 можно представить как 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'),?,?,?,?,?)"); 
Ян_2333
источник
1

Это очень просто, хотя условия в этом ответе находятся в mysql, тип данных столбца - datetime, и вы хотите отправить данные из java-кода в mysql:

java.util.Date dt = новый java.util.Date ();
whatever your code object may be.setDateTime (дт);

Важно просто выбрать дату и ее формат уже в соответствии с форматом mysql и отправить ее, никаких дополнительных изменений не требуется.

Яш Агравал
источник
0

На самом деле вы можете не использовать SimpleDateFormat, вы можете использовать что-то вроде этого;

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

Таким образом вы можете напрямую получить дату в указанном формате.

Сахин Янлык
источник
0

Я по-прежнему предпочитаю метод в одну строку

new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime())
Mohannd
источник
-2

меня устраивает !!

в таблице mysql

DATETIME

в сущности:

private Date startDate;

в процессе:

objectEntity.setStartDate(new Date());

в подготовленном заявлении:

pstm.setDate(9, new java.sql.Date(objEntity.getStartDate().getTime()));
Мигель Алонсо Москера Агилар
источник