Časové razítko
rozšiřuje Date zajistit přesnost nanosekund. Ani Date ani Timestamp jsou navrženy tak, aby odkazovaly na konkrétní časové pásmo jako ZoneDateTime .
Pokud potřebujete převést ZonedDateTime -> Timestamp budete muset zrušit informace o časovém pásmu/offsetu. Např.
LocalDateTime withoutTimezone = zoneDateTime.toLocalDateTime();
Timestamp timestamp = Timestamp.valueOf(withoutTimezone));
a pro převod Timestamp -> ZonedDateTime musíte zadat offset:
LocalDateTime withoutTimezone = sqlTimestamp.toLocalDateTime();
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("+03:00"));
nebo časové pásmo:
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("Europe/Paris"));
Pokud je vaším záměrem uložit ZonedDateTime proměnné v databázi a zachovat různá časová pásma tam uvedená, doporučuji podle toho navrhnout databázi. Návrhy:
- Použijte sloupec typu
DATETIMEpro uloženíLocalDateTimeaVARCHARuložení časového pásma jako"Europe/Paris"neboSMALLINTuložení offsetu během několika minut. - Převeďte
ZonedDateTimedoStringa uložte doVARCHARsloupec jako"2017-05-16T14:12:48.983682+01:00[Europe/London]". Poté jej budete muset analyzovat při čtení z databáze.