Giải pháp là sử dụng các trường TIMESTAMPTZ cho các phiên bản này đúng lúc. Một cái gì đó như "người dùng được tạo khi nào" sẽ không bao giờ được lưu trữ với trường TIMESTAMP vì theo mặc định nó không chứa thông tin TZ. Trình điều khiển JDBC xử lý những điều này khá tùy tiện. Ví dụ, hãy xem xét những điều sau:
Giả sử JVM của bạn ở vùng America / Los_Angeles trong khi máy chủ cơ sở dữ liệu của bạn ở UTC.
Sau đó, tạo bảng sau:
CREATE TABLE test (
id INTEGER,
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tswz TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
Nếu bạn phát hành từ PSQL:
INSERT INTO test(id) values(1);
Bạn sẽ nhận được các giá trị giống hệt nhau cho "ts" và "tswz". Cả hai sẽ là giờ UTC hiện tại. Tuy nhiên, nếu bạn thực hiện truy vấn CÙNG CHÍNH XÁC từ Java bằng trình điều khiển JDBC thì "ts" sẽ là thời gian hiện tại ở Los Angeles và "tswz" sẽ là giờ UTC.
Tôi không biết LÀM THẾ NÀO để trình điều khiển chuyển đến máy chủ múi giờ JVM trong trường hợp này vì chúng tôi đang đặt mặc định trường trên máy chủ. Họ nói rằng họ không đặt múi giờ cho phiên, nhưng họ phải làm như vậy. Dù bằng cách nào, nếu bạn sử dụng trường TIMESTAMPTZ thì bạn sẽ nhận được các phiên bản giống nhau từ bất kỳ JVM nào bất kể múi giờ đó xảy ra ở đâu.