sql >> Database teknologi >  >> RDS >> Oracle

Er java.sql.Timestamp tidszonespecifik?

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).



  1. Få en liste over understøttede tidszoner i SQL Server (T-SQL)

  2. Java Oracle-undtagelse - det maksimale antal udtryk på en liste er 1000

  3. hent flere kolonner grupper efter datointerval

  4. Når der ikke er angivet nogen 'Bestil efter', hvilken rækkefølge vælger en forespørgsel for dit rekordsæt?