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