Въпреки че не е посочен изрично за setTimestamp(int parameterIndex, Timestamp x)
драйверите трябва да спазват правилата, установени от setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
javadoc:
Задава определения параметър на дадения
java.sql.Timestamp
стойност, като използвате даденияCalendar
обект. Драйверът използваCalendar
обект за конструиране на SQLTIMESTAMP
стойност, която след това драйверът изпраща към базата данни. СCalendar
обект, водачът може да изчисли времевата марка, като вземе предвид персонализирана часова зона. Ако нямаCalendar
е посочен обект, драйверът използва часовата зона по подразбиране, която е тази на виртуалната машина, изпълняваща приложението.
Когато се обаждате с setTimestamp(int parameterIndex, Timestamp x)
JDBC драйверът използва часовата зона на виртуалната машина, за да изчисли датата и часа на времевата марка в тази часова зона. Тази дата и час са това, което се съхранява в базата данни и ако колоната на базата данни не съхранява информация за часовата зона, тогава всяка информация за зоната се губи (което означава, че приложението(ата), използващо базата данни, зависи да използва една и съща часова зона последователно или измислете друга схема за разпознаване на часовата зона (т.е. съхранявайте в отделна колона).
Например:Вашата местна часова зона е GMT+2. Вие съхранявате "2012-12-25 10:00:00 UTC". Действителната стойност, съхранена в базата данни, е "2012-12-25 12:00:00". Извличате го отново:връщате го отново като „2012-12-25 10:00:00 UTC“ (но само ако го извлечете с помощта на getTimestamp(..)
) ), но когато друго приложение осъществи достъп до базата данни в часовата зона GMT+0, то ще извлече клеймото за време като „2012-12-25 12:00:00 UTC“.
Ако искате да го съхраните в друга часова зона, тогава трябва да използвате setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
с екземпляр на Calendar в необходимата часова зона. Просто се уверете, че използвате и еквивалентния getter със същата часова зона, когато извличате стойности (ако използвате TIMESTAMP
без информация за часовата зона във вашата база данни).
Така че, ако приемем, че искате да съхраните действителната часова зона по GMT, трябва да използвате:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
stmt.setTimestamp(11, tsSchedStartTime, cal);
С JDBC 4.2 съвместим драйвер трябва да поддържа java.time.LocalDateTime
(и java.time.LocalTime
) за TIMESTAMP
(и TIME
) чрез get/set/updateObject
. java.time.Local*
класовете са без часови зони, така че не е необходимо да се прилага преобразуване (въпреки че това може да създаде нов набор от проблеми, ако кодът ви предполага конкретна часова зона).