Ačkoli to není výslovně uvedeno pro setTimestamp(int parameterIndex, Timestamp x)
řidiči musí dodržovat pravidla stanovená v setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
javadoc:
Nastaví určený parametr na daný
java.sql.Timestamp
hodnotu pomocí danéhoCalendar
objekt. Ovladač používáCalendar
objekt pro vytvoření SQLTIMESTAMP
hodnotu, kterou pak ovladač odešle do databáze. SCalendar
objekt, může řidič vypočítat časové razítko s přihlédnutím k vlastní časové zóně. Pokud žádnýCalendar
Pokud je zadán objekt, ovladač použije výchozí časovou zónu, což je časové pásmo virtuálního počítače, na kterém je aplikace spuštěna.
Když zavoláte pomocí setTimestamp(int parameterIndex, Timestamp x)
ovladač JDBC používá časové pásmo virtuálního počítače k výpočtu data a času časového razítka v tomto časovém pásmu. Toto datum a čas je to, co je uloženo v databázi, a pokud ve sloupci databáze nejsou uloženy informace o časovém pásmu, dojde ke ztrátě všech informací o pásmu (což znamená, že je na aplikacích používajících databázi, aby konzistentně stejné časové pásmo nebo přijít s jiným schématem pro rozlišení časového pásma (tj. uložit do samostatného sloupce).
Například:Vaše místní časové pásmo je GMT+2. Uložíte "2012-12-25 10:00:00 UTC". Skutečná hodnota uložená v databázi je "2012-12-25 12:00:00". Znovu jej načtete:dostanete jej zpět jako „2012-12-25 10:00:00 UTC“ (ale pouze v případě, že jej načtete pomocí getTimestamp(..)
), ale když jiná aplikace přistupuje k databázi v časovém pásmu GMT+0, načte časové razítko jako „2012-12-25 12:00:00 UTC“.
Pokud jej chcete uložit v jiném časovém pásmu, musíte použít setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
s instancí Kalendáře v požadovaném časovém pásmu. Jen se ujistěte, že při načítání hodnot používáte také ekvivalentní getter se stejným časovým pásmem (pokud používáte TIMESTAMP
bez informací o časovém pásmu ve vaší databázi).
Za předpokladu, že chcete uložit skutečné časové pásmo GMT, musíte použít:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
stmt.setTimestamp(11, tsSchedStartTime, cal);
S JDBC 4.2 by měl kompatibilní ovladač podporovat java.time.LocalDateTime
(a java.time.LocalTime
) pro TIMESTAMP
(a TIME
) prostřednictvím get/set/updateObject
. java.time.Local*
třídy jsou bez časových pásem, takže není třeba používat žádný převod (ačkoli to může otevřít novou sadu problémů, pokud váš kód předpokládá konkrétní časové pásmo).