Dấu thời gian
mở rộng Date
để cung cấp độ chính xác nano giây. Cả Date
cũng không phải Timestamp
được thiết kế để tham chiếu đến một múi giờ cụ thể là ZoneDateTime
.
Nếu bạn cần chuyển đổi ZonedDateTime
-> Timestamp
bạn sẽ phải loại bỏ múi giờ / thông tin bù đắp. Ví dụ:
LocalDateTime withoutTimezone = zoneDateTime.toLocalDateTime();
Timestamp timestamp = Timestamp.valueOf(withoutTimezone));
và để chuyển đổi Timestamp
-> ZonedDateTime
bạn cần chỉ định một khoảng chênh lệch:
LocalDateTime withoutTimezone = sqlTimestamp.toLocalDateTime();
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("+03:00"));
hoặc múi giờ:
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("Europe/Paris"));
Nếu ý định của bạn là lưu ZonedDateTime
các biến trong cơ sở dữ liệu và duy trì các múi giờ khác nhau được chỉ định ở đó, tôi khuyên bạn nên thiết kế cơ sở dữ liệu của mình cho phù hợp. Gợi ý:
- Sử dụng một cột thuộc loại
DATETIME
để lưuLocalDateTime
và mộtVARCHAR
lưu múi giờ như"Europe/Paris"
hoặcSMALLINT
tiết kiệm một khoản bù đắp trong vài phút. - Chuyển đổi
ZonedDateTime
thành mộtString
và lưu trongVARCHAR
cột như"2017-05-16T14:12:48.983682+01:00[Europe/London]"
. Sau đó, bạn sẽ phải phân tích cú pháp khi đọc từ cơ sở dữ liệu.