sql >> Database >  >> RDS >> Oracle

Is java.sql.Timestamp tijdzone specifiek?

Hoewel het niet expliciet is gespecificeerd voor setTimestamp(int parameterIndex, Timestamp x) stuurprogramma's moeten de regels volgen die zijn vastgelegd door de setTimestamp(int parameterIndex, Timestamp x, Calendar cal) javadoc:

Stelt de aangewezen parameter in op de gegeven java.sql.Timestamp waarde, met behulp van de gegeven Calendar voorwerp. De bestuurder gebruikt de Calendar object om een ​​SQL TIMESTAMP te construeren waarde, die het stuurprogramma vervolgens naar de database stuurt. Met een Calendar object kan de bestuurder de tijdstempel berekenen, rekening houdend met een aangepaste tijdzone. Indien geen Calendar object is opgegeven, gebruikt het stuurprogramma de standaardtijdzone, namelijk die van de virtuele machine waarop de toepassing wordt uitgevoerd.

Wanneer u aanroept met setTimestamp(int parameterIndex, Timestamp x) het JDBC-stuurprogramma gebruikt de tijdzone van de virtuele machine om de datum en tijd van het tijdstempel in die tijdzone te berekenen. Deze datum en tijd is wat wordt opgeslagen in de database, en als de databasekolom geen tijdzone-informatie opslaat, gaat alle informatie over de zone verloren (wat betekent dat het aan de applicatie(s) die de database gebruiken om de consistent dezelfde tijdzone of bedenk een ander schema om de tijdzone te onderscheiden (bijv. opslaan in een aparte kolom).

Bijvoorbeeld:uw lokale tijdzone is GMT+2. U slaat "2012-12-25 10:00:00 UTC" op. De werkelijke waarde die in de database is opgeslagen, is "2012-12-25 12:00:00". Je haalt het weer op:je krijgt het weer terug als "2012-12-25 10:00:00 UTC" (maar alleen als je het ophaalt met getTimestamp(..) ), maar wanneer een andere toepassing de database in tijdzone GMT+0 benadert, zal deze de tijdstempel ophalen als "2012-12-25 12:00:00 UTC".

Als u het in een andere tijdzone wilt opslaan, moet u de setTimestamp(int parameterIndex, Timestamp x, Calendar cal) gebruiken met een Calendar-instantie in de vereiste tijdzone. Zorg ervoor dat u ook de equivalente getter met dezelfde tijdzone gebruikt bij het ophalen van waarden (als u een TIMESTAMP gebruikt zonder tijdzone-informatie in uw database).

Dus, ervan uitgaande dat u de werkelijke GMT-tijdzone wilt opslaan, moet u het volgende gebruiken:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
stmt.setTimestamp(11, tsSchedStartTime, cal);

Met JDBC 4.2 moet een compatibel stuurprogramma java.time.LocalDateTime ondersteunen (en java.time.LocalTime ) voor TIMESTAMP (en TIME ) via get/set/updateObject . De java.time.Local* klassen hebben geen tijdzones, dus er hoeft geen conversie te worden toegepast (hoewel dat een nieuwe reeks problemen zou kunnen opleveren als uw code een specifieke tijdzone aannam).



  1. SQLite-gebruikersmachtigingen

  2. Walkthrough:SQL Server High Availability instellen

  3. Proactief verzamelen van informatie over fragmentatie van SQL Server-indexen

  4. WHERE_IN query met een samengestelde sleutel?