useTimezone adalah solusi yang lebih lama. Tim MySQL menulis ulang kode setTimestamp/getTimestamp baru-baru ini, tetapi itu hanya akan diaktifkan jika Anda mengatur parameter koneksi useLegacyDatetimeCode=false dan Anda menggunakan versi terbaru konektor JDBC mysql. Jadi misalnya:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false
Jika Anda mengunduh kode sumber konektor mysql dan melihat setTimestamp, sangat mudah untuk melihat apa yang terjadi:
Jika menggunakan kode waktu tanggal lawas =false, newSetTimestampInternal(...) dipanggil. Kemudian, jika Kalender yang diteruskan ke newSetTimestampInternal adalah NULL, objek tanggal Anda diformat dalam zona waktu database:
this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss", Locale.US);
this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
timestampString = this.tsdf.format(x);
Sangat penting bahwa Kalender adalah nol - jadi pastikan Anda menggunakan:
setTimestamp(int,Timestamp).
... BUKAN setTimestamp(int,Timestamp,Calendar).
Seharusnya sudah jelas sekarang bagaimana ini bekerja. Jika Anda membuat tanggal:5 Januari 2011 03:00 di Amerika/Los_Angeles (atau zona waktu apa pun yang Anda inginkan) menggunakan java.util.Calendar dan panggil setTimestamp(1, myDate), maka itu akan mengambil tanggal Anda, gunakan SimpleDateFormat untuk memformatnya di zona waktu basis data . Jadi jika DB Anda berada di America/New_York, itu akan membuat String '2011-01-05 6:00:00' untuk dimasukkan (karena NY lebih dulu dari LA 3 jam).
Untuk mengambil tanggal, gunakan getTimestamp(int) (tanpa Kalender). Sekali lagi itu akan menggunakan zona waktu basis data untuk membuat tanggal.
Catatan:Zona waktu server web sama sekali tidak relevan sekarang! Jika Anda tidak menyetel useLegacyDatetimecode ke false, zona waktu server web digunakan untuk memformat - menambah banyak kebingungan.
Catatan:
Mungkin MySQL saya mengeluh bahwa zona waktu server ambigu. Misalnya, jika database Anda diatur untuk menggunakan EST, mungkin ada beberapa zona waktu EST di Java, jadi Anda dapat mengklarifikasi ini untuk konektor mysql dengan memberi tahu persis apa zona waktu database:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false&serverTimezone=America/New_York";
Anda hanya perlu melakukan ini jika ada keluhan.