2010-07-24 40 views

Trả lời

90

Ở phía Java, ngày thường được đại diện bởi (thiết kế kém, nhưng sang một bên) java.util.Date. Về cơ bản nó được hỗ trợ bởi Epoch time trong hương vị của một long, còn được gọi là dấu thời gian. Nó chứa thông tin về cả ngày và phần thời gian. Trong Java, độ chính xác bằng mili giây.

Trong bên SQL, có một số ngày và thời gian loại tiêu chuẩn, DATE, TIMETIMESTAMP (tại một số của DB hay còn gọi là DATETIME), được trình bày trong JDBC như java.sql.Date, java.sql.Timejava.sql.Timestamp, tất cả lớp con của java.util.Date. Độ chính xác phụ thuộc vào DB, thường bằng mili giây như Java, nhưng nó cũng có thể bằng giây.

Ngược lại với java.util.Date, java.sql.Date chỉ chứa thông tin về phần ngày (năm, tháng, ngày). Time chỉ chứa thông tin về phần thời gian (giờ, phút, giây) và Timestamp chứa thông tin về cả hai phần, như là java.util.Date.

Thực hành thông thường để lưu dấu thời gian trong DB (do đó, java.util.Date ở phía Java và java.sql.Timestamp ở phía JDBC) là sử dụng PreparedStatement#setTimestamp().

java.util.Date date = getItSomehow(); 
Timestamp timestamp = new Timestamp(date.getTime()); 
preparedStatement = connection.prepareStatement("SELECT * FROM tbl WHERE ts > ?"); 
preparedStatement.setTimestamp(1, timestamp); 

Thực hành thông thường để lấy dấu thời gian từ DB là sử dụng ResultSet#getTimestamp().

Timestamp timestamp = resultSet.getTimestamp("ts"); 
java.util.Date date = timestamp; // You can just upcast. 
+6

Bạn có nghĩ rằng việc sử dụng java.sql.Timestamp trong mô hình (lớp Java) không tốt? – cherouvim

+7

@cherouvim: Có. Mô hình không nên biết về bất kỳ chi tiết cụ thể nào của JDBC. Chỉ sử dụng nó để đặt dấu thời gian. 'preparStatement.setTimestamp (Dấu thời gian mới (date.getTime()));'. Làm cho nó dễ dàng vì nó đã là một lớp con của 'java.util.Date'. – BalusC

+1

Điều này sẽ hoạt động tốt nếu tất cả máy và người dùng của bạn ở cùng múi giờ. Nếu không, hãy cẩn thận việc xử lý các chuyển đổi múi giờ của trình điều khiển JDBC của MySQL là vô cùng phức tạp và lỗi. Ví dụ, xem http: // stackoverflow.com/questions/40670532/what-are-jdbc-mysql-driver-settings-for-sane-handling-of-datetime-và-timestamp/40681941 # 40681941 –

6

MySQL documentation có thông tin về ánh xạ các loại MySQL với các loại Java. Nói chung, đối với thời gian và giờ của MySQL, bạn nên sử dụng java.sql.Timestamp. Một vài nguồn lực bao gồm:

http://dev.mysql.com/doc/refman/5.1/en/datetime.html

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

How to store Java Date to Mysql datetime...?

http://www.velocityreviews.com/forums/t599436-the-best-practice-to-deal-with-datetime-in-mysql-using-jdbc.html

EDIT:

Như những người khác đã chỉ ra, những gợi ý của việc sử dụng các chuỗi có thể dẫn đến vấn đề này.

+0

tại sao tốt hơn nên chuyển đổi ngày thành chuỗi? – cherouvim

+6

Đừng xoa bóp nó ra và trở lại như chuỗi. Đó là công thức cho tính di động và khả năng bảo trì. – BalusC

+0

Đồng ý. Tôi đã sửa đổi câu trả lời của tôi cho phù hợp. – Garett

Các vấn đề liên quan