Показател за време
разширява Date
за осигуряване на наносекундна точност. Нито Date
нито Timestamp
са предназначени да се отнасят към конкретна часова зона като ZoneDateTime
.
Ако трябва да конвертирате ZonedDateTime
-> Timestamp
ще трябва да изхвърлите информацията за часовата зона/отместването. Напр.
LocalDateTime withoutTimezone = zoneDateTime.toLocalDateTime();
Timestamp timestamp = Timestamp.valueOf(withoutTimezone));
и за конвертиране на Timestamp
-> ZonedDateTime
трябва да посочите отместване:
LocalDateTime withoutTimezone = sqlTimestamp.toLocalDateTime();
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("+03:00"));
или часова зона:
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("Europe/Paris"));
Ако намерението ви е да запазите ZonedDateTime
променливи в базата данни и запазване на различните часови зони, посочени там, препоръчвам да проектирате вашата база данни съответно. Предложения:
- Използвайте колона от тип
DATETIME
за да запишетеLocalDateTime
иVARCHAR
запазване на часова зона като"Europe/Paris"
илиSMALLINT
запазване на отместване за минути. - Конвертирайте
ZonedDateTime
къмString
и запишете вVARCHAR
колона като"2017-05-16T14:12:48.983682+01:00[Europe/London]"
. След това ще трябва да го анализирате, когато четете от базата данни.