Khách hàng của bạn getDate()
mã trông đúng khi nó đi. Tôi nghĩ rằng bạn cũng cần tải Trình kết nối MySQL / Trình điều khiển J JDBC để xử lý các ngày được lưu trữ trong bảng dưới dạng ngày UTC, để tránh chuyển đổi múi giờ giả. Điều này có nghĩa là đặt múi giờ máy chủ hiệu quả, ngoài múi giờ phiên khách và Lịch được sử dụng cho JDBC getTimestamp
cuộc gọi như bạn đang làm.
Hãy xem các giá trị bạn nhận được khi xác nhận không thành công và lỗi theo hướng nào:
expected:<Thu Apr 16 11:30:30 BST 2015> but was:<Thu Apr 16 10:30:30 BST 2015>
Những gì bạn nhận lại là 10:30 BST, tức là 9:30 GMT. Điều này phù hợp với cơ sở dữ liệu coi 10:30 đó trong bảng là giá trị BST và nhanh chóng chuyển đổi nó thành GMT cho bạn, trước khi bạn phân tích cú pháp nó thành ngày GMT. Đó là hướng ngược lại của một giá trị GMT đang được chuyển đổi nhanh chóng thành BST.
Đây có thể là vấn đề dành riêng cho JDBC, vì JDBC yêu cầu chuyển đổi thời gian thành vùng cục bộ. (Trường hợp API MySQL C không có, có thể là do các kiểu thời gian cổ điển của C không nhận biết vùng theo cách của Java.) Và nó cần biết vùng mà nó đang chuyển đổi từ , cũng. MySQL TIMESTAMP
loại luôn được lưu trữ dưới dạng UTC. Nhưng điều đó không được nêu cho DATETIME
loại hình. Tôi nghĩ rằng điều đó ngụ ý rằng MySQL sẽ diễn giải DATETIME
giá trị cột theo múi giờ của máy chủ. Cái mà bạn đã đề cập là được đặt thành BST và điều đó phù hợp với hướng thay đổi được hiển thị trong thông báo lỗi xác nhận của bạn.
time_zone
biến phiên bạn đặt đang cho máy chủ MySQL biết múi giờ của máy khách của bạn là gì, nhưng nó không ảnh hưởng đến việc máy chủ nghĩ múi giờ của chính nó. Điều đó có thể được ghi đè bằng serverTimezone
Thuộc tính kết nối JDBC
. Trên kết nối của bạn, hãy đặt serverTimezone
sang UTC và đảm bảo rằng useLegacyDatetimeCode
No tăt rôi. (Và xem xét các thuộc tính khác liên quan đến vùng nếu điều đó không hoạt động.) Xem liệu điều đó có giúp ngày của bạn chuyển thành UTC với cùng các giá trị trường lịch như trong cơ sở dữ liệu hay không.
Lưu ý rằng điều này sẽ thay đổi cách diễn giải của DATETIME
khác giá trị trong cơ sở dữ liệu của bạn:tất cả chúng sẽ trông giống như ngày UTC ngay bây giờ (trong bối cảnh kết nối JDBC của bạn). Điều đó có chính xác hay không sẽ phụ thuộc vào cách chúng được điền vào ban đầu. Mặc dù mã máy khách của bạn sẽ có hành vi như bạn muốn, nhưng tôi không biết liệu toàn bộ hệ thống này có thể hoạt động hoàn toàn nhất quán mà không cần đặt múi giờ của máy chủ thành UTC ở cấp máy chủ hay không. Về cơ bản, nếu vùng của nó không được đặt thành UTC, nó không được định cấu hình đầy đủ cho hành vi bạn muốn và bạn đang lẩn tránh nó.