Timestamp
udvider Date
for at give nanosekunds nøjagtighed. Hverken Date
heller ikke Timestamp
er designet til at referere til en bestemt tidszone som ZoneDateTime
.
Hvis du har brug for at konvertere ZonedDateTime
-> Timestamp
du bliver nødt til at kassere tidszone-/forskydningsoplysningerne. F.eks.
LocalDateTime withoutTimezone = zoneDateTime.toLocalDateTime();
Timestamp timestamp = Timestamp.valueOf(withoutTimezone));
og til konvertering af Timestamp
-> ZonedDateTime
du skal angive en offset:
LocalDateTime withoutTimezone = sqlTimestamp.toLocalDateTime();
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("+03:00"));
eller tidszone:
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("Europe/Paris"));
Hvis din hensigt er at gemme ZonedDateTime
variabler i databasen og bevare de forskellige tidszoner, der er angivet der, anbefaler jeg at designe din database i overensstemmelse hermed. Forslag:
- Brug en kolonne af typen
DATETIME
for at gemme enLocalDateTime
og enVARCHAR
gemmer en tidszone som"Europe/Paris"
eller enSMALLINT
gemmer en offset på få minutter. - Konverter
ZonedDateTime
til enString
og gem i enVARCHAR
kolonne som"2017-05-16T14:12:48.983682+01:00[Europe/London]"
. Du bliver så nødt til at parse det, når du læser fra databasen.