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

JPA TemporalType.Date đưa ra ngày sai

Rất xin lỗi nhưng tất cả các câu trả lời cho đến nay thường không chính xác. Câu trả lời khá đơn giản nhưng yêu cầu chúng ta tách ra năm điểm:

  1. DATE =java.sql.Date, là một trình bao bọc xung quanh java.util.Date, đó là số mili giây kể từ Kỷ nguyên trong múi giờ UTC. Vì vậy, điều này có năm / tháng / ngày / giờ / phút / giây trong múi giờ GMT + 0 (UTC) cố định. Tuy nhiên, lưu ý rằng java.sql.Date đặt các thành phần thời gian bằng 0!
  2. TIMESTAMP =java.sql.TimeStamp là một trình bao bọc thành phần xung quanh Ngày, thêm giây phân số để hỗ trợ tiêu chuẩn kiểu SQL DATE. Loại / loại này không liên quan hoặc không cần thiết cho câu hỏi này nhưng tóm lại, loại này có ngày tháng và thời gian.
  3. Cơ sở dữ liệu lưu trữ các đối tượng DATE như được xác định (sử dụng UTC làm phần bù từ Java) nhưng có thể dịch thời gian nếu được định cấu hình trong cơ sở dữ liệu sang múi giờ khác. Theo mặc định, hầu hết các cơ sở dữ liệu được đặt mặc định theo múi giờ của máy chủ cục bộ, đây là một ý tưởng rất tồi. Thưa quý vị ... LUÔN lưu trữ các đối tượng DATE theo giờ UTC. Đọc tiếp ...
  4. Thời gian trong JVM và múi giờ cần phải chính xác. Vì đối tượng Ngày đang sử dụng UTC, nên bù đắp có được tính cho thời gian máy chủ của bạn không? Hãy cân nhắc điều đó với khuyến nghị mạnh mẽ rằng thời gian máy chủ được đặt thành GMT + 0 (UTC).
  5. Cuối cùng khi chúng tôi muốn hiển thị DATE từ cơ sở dữ liệu (sử dụng JSF hoặc bất cứ thứ gì), nó nên được thiết lập thành múi giờ GMT + 0 và, nếu được thực hiện từ máy chủ trở lên ... ngày và giờ của bạn sẽ LUÔN nhất quán, có thể tham khảo và mọi điều tốt đẹp. Tất cả những gì còn lại là hiển thị thời gian và ĐÂY là nơi tác nhân người dùng (ví dụ:đối với một ứng dụng web) có thể được sử dụng để dịch giờ GMT + 0 sang múi giờ "địa phương" của người dùng.

Tóm tắt:Sử dụng UTC (GMT + 0) trên máy chủ, trong cơ sở dữ liệu, trong các đối tượng Java của bạn.

DATE và TIMESTAMP chỉ khác ở góc độ cơ sở dữ liệu ở chỗ TIMESTAMP mang thêm phần giây. Cả hai đều sử dụng GMT + 0 (ngụ ý). JodaTime là một khung lịch ưa thích để giải quyết tất cả những điều này nhưng sẽ không khắc phục được các vấn đề về JVM không khớp với cài đặt múi giờ cơ sở dữ liệu.

Nếu các thiết kế ứng dụng từ JVM đến DB không sử dụng GMT, do tiết kiệm ánh sáng ban ngày, điều chỉnh đồng hồ và tất cả các loại trò chơi khu vực khác được chơi trên đồng hồ địa phương trên thế giới ... thì thời gian giao dịch và mọi thứ khác sẽ mãi mãi bị sai lệch , không tham chiếu, không nhất quán, v.v.

Một câu trả lời hay khác có liên quan về các loại dữ liệu: java.util .Date so với java.sql.Date

Cũng lưu ý rằng Java 8 có các bản cập nhật với khả năng xử lý ngày / giờ tốt hơn (cuối cùng) nhưng điều này không khắc phục được việc đồng hồ máy chủ mà JVM đang chạy ở một múi giờ và cơ sở dữ liệu ở một múi giờ khác. Tại thời điểm này, luôn luôn có dịch xảy ra. Trong mọi ứng dụng khách lớn (thông minh) mà tôi làm việc, múi giờ của cơ sở dữ liệu và máy chủ JVM được đặt thành UTC vì lý do này, ngay cả khi các hoạt động của chúng phần lớn xảy ra ở một số múi giờ khác.



  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ản ghi SQL Count trong vòng một tháng sử dụng dấu thời gian unix

  2. Lưu đường dẫn tệp vào Cơ sở dữ liệu / SQL

  3. Giảm thiểu các truy vấn SQL bằng cách sử dụng phép nối với mối quan hệ một-nhiều

  4. Những sai lầm hàng đầu cần tránh trong MySQL Replication

  5. MySQL Chọn truy vấn để tìm nạp cơ sở bản ghi trên các giá trị danh sách