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ưuLocalDateTimevà mộtVARCHARlưu múi giờ như"Europe/Paris"hoặcSMALLINTtiết kiệm một khoản bù đắp trong vài phút. - Chuyển đổi
ZonedDateTimethành mộtStringvà lưu trongVARCHARcộ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.