Cách lưu trữ Ngày của Java thành Mysql datetime với JPA


104

Bất kỳ cơ quan nào có thể cho tôi biết làm thế nào tôi có thể lưu trữ Java Date thành Mysql datetime ...?

Khi tôi đang cố gắng làm như vậy ... chỉ có ngày được lưu trữ và thời gian còn lại 00:00:00 trong các cửa hàng ngày Mysql như thế này ...

2009-09-22 00:00:00

Tôi không chỉ muốn ngày mà còn cả thời gian ... như

2009-09-22 08:08:11

Tôi đang sử dụng JPA (Hibernate) với các lớp mydomain mùa xuân sử dụng java.util.Date nhưng tôi đã tạo bảng bằng cách sử dụng truy vấn viết tay ...

đây là tuyên bố tạo của tôi

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;

phần mã của bạn, có lẽ?
Bozho


1
Những ngày này bạn không còn sử dụng nữa java.util.Date(năm 2010 có lẽ không có lựa chọn nào tốt hơn). Tốt hơn nên sử dụng các lớp hiện đại, như java.time.Instanthoặc java.time.LocalDateTime, tùy thuộc vào yêu cầu chính xác về ngày-giờ bạn cần lưu trữ.
Ole VV

Một số câu trả lời cũ này xuất hiện khá cao trên bảng xếp hạng của Google. Trong Java 8+ chúng tôi chỉ đơn giản là có thể sử dụng để lưu LocalDateTime datetime thay vì phải dùng đến sử dụng @Temporal để lưu ở định dạng datetime
HopeKing

readyStatement.setTimestamp (1, Dấu thời gian mới (System.currentTimeMillis ()));
Rajat

Câu trả lời:


165

xem trong liên kết:

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

Đoạn mã sau chỉ giải quyết được vấn đề:

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 ' này đã được chèn vào cột có kiểu là DateTime và nó đã thành công.


4
nhưng, currentTime là một đối tượng String và trong db, chúng tôi lấy datetime làm kiểu dữ liệu, tôi nghĩ rằng nó sẽ không được chèn vào. phải không?
reddy

yyyy-MM-dd HH:mm:sslà rất quan trọng. Ghi chú cách viết hoa.
biniam,

91

Chú thích trường của bạn (hoặc getter) với @Temporal(TemporalType.TIMESTAMP), như sau:

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

Điều đó sẽ làm các trick.


2
Đây là câu trả lời thực sự!
Perneel

2
lên cho điều này, đây là câu trả lời thích hợp.
Ryan

3
lưu ý rằng nếu bạn chọn giải pháp này, ngày của bạn sẽ xuất hiện dưới dạng dấu thời gian khi được tìm nạp từ db. Nó sẽ không có đẹp định dạng 'yyyy-MM-dd ....')
jon

37

Có lẽ bạn đang sử dụng java.sql.Date? Mặc dù có độ chi tiết mili giây như một lớp Java (nó là một lớp con của java.util.Datequyết định thiết kế tồi), nó sẽ được trình điều khiển JDBC giải thích là một ngày không có thành phần thời gian. Bạn phải sử dụng java.sql.Timestampthay thế.


1
Tôi sẽ không sử dụng java.sql.Datehoặc java.sql.Timestamptrong các lớp miền nhưng tôi đoán điều này đã được viết trước khi chỉnh sửa OP.
Pascal Thivent

Tôi sẽ. Các đối tượng java.util.Date không so sánh với các đối tượng java.sql.Timestamp với kết quả hoàn toàn có thể đoán trước được.
Doug Moscrop

8

Có thể là do ngày java của bạn có định dạng khác với mysql format(YYYY-MM-DD HH:MM:SS )

làm cái này

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

Bạn đã đề cập đến định dạng đúng trong tài liệu tham khảo và sau đó sử dụng định dạng sai trong mã.
Merric Huffstutler

6

bạn sẽ nhận được định dạng thời gian 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 -> ngày giờ của 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

Sử dụng mã sau để chèn ngày vào MySQL. Thay vì thay đổi định dạng ngày của chúng tôi để đáp ứng yêu cầu của MySql, chúng tôi có thể giúp cơ sở dữ liệu nhận ra ngày của chúng tôi bằng cách đặtSTR_TO_DATE(?, '%l:%i %p') tham số.

Ví dụ: 2014-03-12 có thể được biểu thị là 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

Mặc dù điều kiện rất đơn giản của nó trong câu trả lời này là trong mysql kiểu dữ liệu cột là datetime và bạn muốn gửi dữ liệu từ mã java đến mysql:

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

điều quan trọng là chỉ cần chọn ngày và định dạng của nó đã là theo định dạng mysql và gửi nó, không cần sửa đổi thêm.


0

Trên thực tế, bạn có thể không sử dụng SimpleDateFormat, bạn có thể sử dụng một cái gì đó như thế này;

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

Bằng cách này, bạn có thể trực tiếp lấy ngày với định dạng như đã chỉ định.


0

Tôi vẫn thích phương pháp trong một dòng

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

-2

nó hoạt động cho tôi !!

trong bảng mysql

DATETIME

trong thực thể:

private Date startDate;

đang tiến hành:

objectEntity.setStartDate(new Date());

trong bản chuẩn bị

pstm.setDate(9, new java.sql.Date(objEntity.getStartDate().getTime()));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.