Mặc dù nó không được chỉ định rõ ràng cho setTimestamp(int parameterIndex, Timestamp x)
trình điều khiển phải tuân theo các quy tắc được thiết lập bởi setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
javadoc:
Đặt tham số được chỉ định thành
java.sql.Timestamp
đã cho giá trị, sử dụngCalendar
đã cho vật. Người lái xe sử dụngCalendar
đối tượng để xây dựng một SQLTIMESTAMP
giá trị mà trình điều khiển sau đó sẽ gửi đến cơ sở dữ liệu. VớiCalendar
đối tượng, người lái xe có thể tính toán dấu thời gian có tính đến múi giờ tùy chỉnh. Nếu không cóCalendar
đối tượng được chỉ định, trình điều khiển sử dụng múi giờ mặc định, là múi giờ của máy ảo đang chạy ứng dụng.
Khi bạn gọi bằng setTimestamp(int parameterIndex, Timestamp x)
trình điều khiển JDBC sử dụng múi giờ của máy ảo để tính ngày và giờ của dấu thời gian trong múi giờ đó. Ngày và giờ này là những gì được lưu trữ trong cơ sở dữ liệu và nếu cột cơ sở dữ liệu không lưu trữ thông tin múi giờ, thì bất kỳ thông tin nào về múi giờ sẽ bị mất (có nghĩa là tùy thuộc vào (các) ứng dụng sử dụng cơ sở dữ liệu để sử dụng cùng một múi giờ nhất quán hoặc đưa ra một lược đồ khác để phân biệt múi giờ (tức là lưu trữ trong một cột riêng biệt).
Ví dụ:Múi giờ địa phương của bạn là GMT + 2. Bạn lưu trữ "2012-12-25 10:00:00 UTC". Giá trị thực được lưu trữ trong cơ sở dữ liệu là "2012-12-25 12:00:00". Bạn truy xuất lại nó:bạn lấy lại nó là "2012-12-25 10:00:00 UTC" (nhưng chỉ khi bạn truy xuất nó bằng getTimestamp(..)
), nhưng khi một ứng dụng khác truy cập cơ sở dữ liệu theo múi giờ GMT + 0, nó sẽ truy xuất dấu thời gian là "2012-12-25 12:00:00 UTC".
Nếu bạn muốn lưu trữ nó ở một múi giờ khác, thì bạn cần sử dụng setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
với một phiên bản Lịch trong múi giờ bắt buộc. Chỉ cần đảm bảo rằng bạn cũng sử dụng getter tương đương với cùng múi giờ khi truy xuất các giá trị (nếu bạn sử dụng TIMESTAMP
không có thông tin múi giờ trong cơ sở dữ liệu của bạn).
Vì vậy, giả sử bạn muốn lưu trữ múi giờ GMT thực tế, bạn cần sử dụng:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
stmt.setTimestamp(11, tsSchedStartTime, cal);
Với JDBC 4.2, trình điều khiển tương thích sẽ hỗ trợ java.time.LocalDateTime
(và java.time.LocalTime
) cho TIMESTAMP
(và TIME
) thông qua get/set/updateObject
. java.time.Local*
các lớp không có múi giờ, vì vậy không cần áp dụng chuyển đổi (mặc dù điều đó có thể mở ra một loạt vấn đề mới nếu mã của bạn đã giả sử một múi giờ cụ thể).