Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Múi giờ java.sql.Timestamp có cụ thể không?

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ụng Calendar đã cho vật. Người lái xe sử dụng Calendar đối tượng để xây dựng một SQL TIMESTAMP giá trị mà trình điều khiển sau đó sẽ gửi đến cơ sở dữ liệu. Với Calendar đố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ể).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bật SSL hoặc TLS trong Oracle Apps R12

  2. Lỗi bỏ phiếu KGXGN (15)

  3. Thay đổi độ chính xác của cột số trong Oracle

  4. Cách chuyển số thành từ - ORACLE

  5. Oracle Text sẽ không hoạt động với NVARCHAR2. Những gì khác có thể không có sẵn?