Timestamp estende
Date
para fornecer precisão de nanossegundos. Nem Date
nem Timestamp
são projetados para se referir a um fuso horário específico como ZoneDateTime
. Se você precisar converter
ZonedDateTime
-> Timestamp
você terá que descartar as informações de fuso horário/deslocamento. Por exemplo. LocalDateTime withoutTimezone = zoneDateTime.toLocalDateTime();
Timestamp timestamp = Timestamp.valueOf(withoutTimezone));
e para converter
Timestamp
-> ZonedDateTime
você precisa especificar um deslocamento:LocalDateTime withoutTimezone = sqlTimestamp.toLocalDateTime();
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("+03:00"));
ou fuso horário:
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("Europe/Paris"));
Se sua intenção é salvar
ZonedDateTime
variáveis no banco de dados e preservar os vários fusos horários especificados lá, recomendo projetar seu banco de dados de acordo. Sugestões:- Use uma coluna do tipo
DATETIME
para salvar umLocalDateTime
e umVARCHAR
salvar um fuso horário como"Europe/Paris"
ou umSMALLINT
salvando um deslocamento em minutos. - Converter o
ZonedDateTime
para umaString
e salve em umVARCHAR
coluna como"2017-05-16T14:12:48.983682+01:00[Europe/London]"
. Você terá que analisá-lo ao ler do banco de dados.