sygnatura czasowa
wydłuża Date
aby zapewnić dokładność nanosekundową. Ani Date
ani Timestamp
są zaprojektowane tak, aby odwoływać się do określonej strefy czasowej jako ZoneDateTime
.
Jeśli potrzebujesz przekonwertować ZonedDateTime
-> Timestamp
będziesz musiał odrzucić informacje o strefie czasowej/przesunięciu. Np.
LocalDateTime withoutTimezone = zoneDateTime.toLocalDateTime();
Timestamp timestamp = Timestamp.valueOf(withoutTimezone));
i do konwersji Timestamp
-> ZonedDateTime
musisz określić przesunięcie:
LocalDateTime withoutTimezone = sqlTimestamp.toLocalDateTime();
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("+03:00"));
lub strefa czasowa:
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("Europe/Paris"));
Jeśli Twoim zamiarem jest zapisanie ZonedDateTime
zmiennych w bazie danych i zachować różne strefy czasowe tam określone, zalecam odpowiednie zaprojektowanie bazy danych. Sugestie:
- Użyj kolumny typu
DATETIME
aby zapisaćLocalDateTime
iVARCHAR
zapisywanie strefy czasowej, takiej jak"Europe/Paris"
lubSMALLINT
zapisanie przesunięcia w kilka minut. - Konwertuj
ZonedDateTime
doString
i zapisz wVARCHAR
kolumna jak"2017-05-16T14:12:48.983682+01:00[Europe/London]"
. Będziesz wtedy musiał przeanalizować go podczas czytania z bazy danych.