Chociaż nie jest to wyraźnie określone dla setTimestamp(int parameterIndex, Timestamp x)
sterowniki muszą przestrzegać reguł ustanowionych przez setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
javadoc:
Ustawia wyznaczony parametr na podany java.sql.Timestamp
wartość, używając podanego Calendar
obiekt. Sterownik korzysta z Calendar
obiekt do skonstruowania SQL TIMESTAMP
wartość, którą sterownik następnie wysyła do bazy danych. Z Calendar
obiekt, kierowca może obliczyć znacznik czasu z uwzględnieniem niestandardowej strefy czasowej. Jeśli nie Calendar
określony obiekt, sterownik używa domyślnej strefy czasowej, która jest strefą maszyny wirtualnej z uruchomioną aplikacją.
Kiedy dzwonisz z setTimestamp(int parameterIndex, Timestamp x)
sterownik JDBC używa strefy czasowej maszyny wirtualnej do obliczania daty i godziny znacznika czasu w tej strefie czasowej. Ta data i godzina jest przechowywana w bazie danych, a jeśli kolumna bazy danych nie przechowuje informacji o strefie czasowej, wszelkie informacje o strefie zostaną utracone (co oznacza, że to od aplikacji korzystających z bazy danych zależy użycie spójnie w tej samej strefie czasowej lub wymyśl inny schemat rozróżniania strefy czasowej (tj. przechowuj w osobnej kolumnie).
Na przykład:Twoja lokalna strefa czasowa to GMT+2. Przechowujesz „2012-12-25 10:00:00 UTC”. Rzeczywista wartość przechowywana w bazie danych to „2012-12-25 12:00:00”. Odzyskujesz go ponownie:otrzymasz go ponownie jako „2012-12-25 10:00:00 UTC” (ale tylko wtedy, gdy odzyskasz go za pomocą getTimestamp(..)
), ale gdy inna aplikacja uzyskuje dostęp do bazy danych w strefie czasowej GMT+0, pobierze znacznik czasu jako „2012-12-25 12:00:00 UTC”.
Jeśli chcesz przechowywać go w innej strefie czasowej, musisz użyć setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
z instancją Kalendarza w wymaganej strefie czasowej. Tylko upewnij się, że używasz równoważnego gettera z tą samą strefą czasową podczas pobierania wartości (jeśli używasz TIMESTAMP
bez informacji o strefie czasowej w Twojej bazie danych).
Zakładając więc, że chcesz zapisać aktualną strefę czasową GMT, musisz użyć:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
stmt.setTimestamp(11, tsSchedStartTime, cal);
Z JDBC 4.2 zgodny sterownik powinien obsługiwać java.time.LocalDateTime
(i java.time.LocalTime
) dla TIMESTAMP
(i TIME
) przez get/set/updateObject
. java.time.Local*
klasy nie mają stref czasowych, więc nie trzeba stosować konwersji (chociaż może to spowodować nowy zestaw problemów, jeśli twój kod zakłada określoną strefę czasową).