Як зберігати Java Date до Mysql datetime за допомогою JPA


104

Чи може будь-який орган сказати мені, як я можу зберігати Java Date в Mysql datetime ...?

Коли я намагаюся це зробити ... зберігається тільки дата, а час зберігається 00:00:00 у магазинах дат Mysql, як цей ...

2009-09-22 00:00:00

Я хочу не тільки побачення, але і час ... як

2009-09-22 08:08:11

Я використовую JPA (Hibernate) з весняними класами 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
У ці дні вам більше не слід користуватися java.util.Date(у 2010 році, мабуть, не було кращого вибору). Краще використовувати сучасні класи, наприклад, java.time.Instantабо java.time.LocalDateTime, залежно від точних вимог до дати та часу, який потрібно зберігати.
Оле ВВ

Деякі з цих старих відповідей виявляються досить високими в рейтингу Google. У Java 8+ ми можемо просто використовувати LocalDateTime, щоб зберегти дату, а не вдаватися до @Temporal для збереження у форматі дати
HopeKing

readyStatement.setTimestamp (1, нова Timestamp (System.currentTimeMillis ()));
Раджат

Відповіді:


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 як тип даних, я думаю, що він не збирається вставляти.
reddy

yyyy-MM-dd HH:mm:ssдуже важливо. Візьміть до відома капіталізацію.
біням

91

Повідомте своє поле (або геттер) @Temporal(TemporalType.TIMESTAMP)таким чином:

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

Це повинно зробити трюк.


2
Це справді відповідь!
Пернель

2
для цього, це правильна відповідь.
Райан

3
майте на увазі, що якщо ви виберете це рішення, ваша дата буде відображатися як часова марка, коли ви отримаєте з db. Це не буде мати красиво форматування «рррр-ММ-дд ....»)
Йон

37

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


1
Я б не використовував java.sql.Dateабо java.sql.Timestampв доменних класах, але, мабуть, це було написано до редагування ОП.
Паскаль Thivent

Я би. Об'єкти java.util.Date не порівнюються з java.sql.Timestamp об'єктами з цілком передбачуваними результатами.
Doug Moscrop

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

Ви вказали правильний формат у посиланні, а потім використали неправильний формат у коді.
Merric Huffstutler

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

Використовуйте наступний код, щоб вставити дату в 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'),?,?,?,?,?)"); 

1

Дуже просто, хоча умови у цій відповіді містяться в mysql, тип даних стовпця - це дата date, і ви хочете відправити дані з коду Java в mysql:

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

Важливо лише вибрати дату, і її формат вже відповідає формату 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())

-2

це працює для мене !!

в таблиці mysql

DATETIME

в утворенні:

private Date startDate;

В процесі:

objectEntity.setStartDate(new Date());

у підготовленому стані:

pstm.setDate(9, new java.sql.Date(objEntity.getStartDate().getTime()));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.