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