Timestamp
utökar Date
för att ge nanosekunders noggrannhet. Inte heller Date
inte heller Timestamp
är utformade för att referera till en specifik tidszon som ZoneDateTime
.
Om du behöver konvertera ZonedDateTime
-> Timestamp
du måste kassera informationen om tidszon/offset. T.ex.
LocalDateTime withoutTimezone = zoneDateTime.toLocalDateTime();
Timestamp timestamp = Timestamp.valueOf(withoutTimezone));
och för att konvertera Timestamp
-> ZonedDateTime
du måste ange en offset:
LocalDateTime withoutTimezone = sqlTimestamp.toLocalDateTime();
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("+03:00"));
eller tidszon:
ZonedDateTime withTimezone = withoutTimezone.atZone(ZoneId.of("Europe/Paris"));
Om din avsikt är att spara ZonedDateTime
variabler i databasen och bevara de olika tidszonerna som anges där, rekommenderar jag att du utformar din databas därefter. Förslag:
- Använd en kolumn av typen
DATETIME
för att spara enLocalDateTime
och enVARCHAR
sparar en tidszon som"Europe/Paris"
eller enSMALLINT
sparar en offset på några minuter. - Konvertera
ZonedDateTime
till enString
och spara i enVARCHAR
kolumn som"2017-05-16T14:12:48.983682+01:00[Europe/London]"
. Du måste sedan analysera den när du läser från databasen.