Č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
DATETIME
pro uloženíLocalDateTime
aVARCHAR
uložení časového pásma jako"Europe/Paris"
neboSMALLINT
uložení offsetu během několika minut. - Převeďte
ZonedDateTime
doString
a uložte doVARCHAR
sloupec jako"2017-05-16T14:12:48.983682+01:00[Europe/London]"
. Poté jej budete muset analyzovat při čtení z databáze.