Meskipun tidak secara eksplisit ditentukan untuk setTimestamp(int parameterIndex, Timestamp x)
pengemudi harus mengikuti aturan yang ditetapkan oleh setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
javadoc:
Menyetel parameter yang ditentukan ke
java.sql.Timestamp
yang diberikan nilai, menggunakanCalendar
. yang diberikan obyek. Pengemudi menggunakanCalendar
objek untuk membuat SQLTIMESTAMP
nilai, yang kemudian dikirim oleh driver ke database. DenganCalendar
objek, pengemudi dapat menghitung stempel waktu dengan mempertimbangkan zona waktu khusus. Jika tidak adaCalendar
objek ditentukan, driver menggunakan zona waktu default, yaitu mesin virtual yang menjalankan aplikasi.
Saat Anda menelepon dengan setTimestamp(int parameterIndex, Timestamp x)
driver JDBC menggunakan zona waktu mesin virtual untuk menghitung tanggal dan waktu stempel waktu di zona waktu tersebut. Tanggal dan waktu ini adalah apa yang disimpan dalam database, dan jika kolom database tidak menyimpan informasi zona waktu, maka informasi apa pun tentang zona tersebut akan hilang (yang berarti terserah aplikasi yang menggunakan database untuk menggunakan zona waktu yang sama secara konsisten atau buat skema lain untuk membedakan zona waktu (yaitu simpan di kolom terpisah).
Misalnya:Zona waktu lokal Anda adalah GMT+2. Anda menyimpan "2012-12-25 10:00:00 UTC". Nilai aktual yang disimpan dalam database adalah "2012-12-25 12:00:00". Anda mengambilnya lagi:Anda mendapatkannya kembali sebagai "2012-12-25 10:00:00 UTC" (tetapi hanya jika Anda mengambilnya menggunakan getTimestamp(..)
), tetapi ketika aplikasi lain mengakses database dalam zona waktu GMT+0, itu akan mengambil stempel waktu sebagai "2012-12-25 12:00:00 UTC".
Jika Anda ingin menyimpannya di zona waktu yang berbeda, maka Anda perlu menggunakan setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
dengan instance Kalender di zona waktu yang diperlukan. Pastikan Anda juga menggunakan pengambil yang setara dengan zona waktu yang sama saat mengambil nilai (jika Anda menggunakan TIMESTAMP
tanpa informasi zona waktu di database Anda).
Jadi, dengan asumsi Anda ingin menyimpan zona waktu GMT yang sebenarnya, Anda perlu menggunakan:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
stmt.setTimestamp(11, tsSchedStartTime, cal);
Dengan JDBC 4.2, driver yang sesuai harus mendukung java.time.LocalDateTime
(dan java.time.LocalTime
) untuk TIMESTAMP
(dan TIME
) melalui get/set/updateObject
. java.time.Local*
kelas tidak memiliki zona waktu, jadi tidak ada konversi yang perlu diterapkan (walaupun itu mungkin membuka serangkaian masalah baru jika kode Anda mengasumsikan zona waktu tertentu).