Selvom det ikke er eksplicit angivet for setTimestamp(int parameterIndex, Timestamp x)
chauffører skal følge reglerne fastsat af setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
javadoc:
Indstiller den udpegede parameter til den givne java.sql.Timestamp
værdi ved at bruge den givne Calendar
objekt. Driveren bruger Calendar
objekt til at konstruere en SQL TIMESTAMP
værdi, som driveren derefter sender til databasen. Med en Calendar
objekt, kan føreren beregne tidsstemplet under hensyntagen til en tilpasset tidszone. Hvis ingen Calendar
objektet er angivet, bruger driveren standardtidszonen, som er den for den virtuelle maskine, der kører applikationen.
Når du kalder med setTimestamp(int parameterIndex, Timestamp x)
JDBC-driveren bruger den virtuelle maskines tidszone til at beregne datoen og klokkeslættet for tidsstemplet i denne tidszone. Denne dato og klokkeslæt er det, der er gemt i databasen, og hvis databasekolonnen ikke gemmer tidszoneoplysninger, går enhver information om zonen tabt (hvilket betyder, at det er op til applikationen/applikationerne, der bruger databasen, at bruge samme tidszone konsekvent eller kom med et andet skema til at skelne tidszone (dvs. gem i en separat kolonne).
For eksempel:Din lokale tidszone er GMT+2. Du gemmer "2012-12-25 10:00:00 UTC". Den faktiske værdi gemt i databasen er "2012-12-25 12:00:00". Du henter det igen:du får det tilbage igen som "2012-12-25 10:00:00 UTC" (men kun hvis du henter det ved hjælp af getTimestamp(..)
), men når en anden applikation får adgang til databasen i tidszonen GMT+0, vil den hente tidsstemplet som "2012-12-25 12:00:00 UTC".
Hvis du vil gemme det i en anden tidszone, skal du bruge setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
med en Kalender-forekomst i den påkrævede tidszone. Bare sørg for, at du også bruger den tilsvarende getter med samme tidszone, når du henter værdier (hvis du bruger en TIMESTAMP
uden tidszoneoplysninger i din database).
Så forudsat at du vil gemme den faktiske GMT-tidszone, skal du bruge:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
stmt.setTimestamp(11, tsSchedStartTime, cal);
Med JDBC 4.2 bør en kompatibel driver understøtte java.time.LocalDateTime
(og java.time.LocalTime
) for TIMESTAMP
(og TIME
) gennem get/set/updateObject
. java.time.Local*
klasser er uden tidszoner, så der skal ikke anvendes nogen konvertering (selvom det kan åbne et nyt sæt problemer, hvis din kode antager en bestemt tidszone).