Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengambil bidang UTC DATETIME dari MySQL di Java ketika zona waktu server bukan UTC

Klien Anda getDate() kode terlihat benar sejauh ini. Saya pikir Anda juga perlu mendapatkan driver MySQL Connector/J JDBC untuk menangani tanggal yang disimpan dalam tabel sebagai tanggal UTC, untuk menghindari konversi zona waktu palsu. Ini berarti menyetel zona waktu server yang efektif, selain zona waktu sesi klien dan Kalender yang digunakan untuk JDBC getTimestamp menelepon seperti yang Anda lakukan.

Lihat nilai yang Anda dapatkan dalam pernyataan gagal Anda, dan arah kesalahannya:

expected:<Thu Apr 16 11:30:30 BST 2015> but was:<Thu Apr 16 10:30:30 BST 2015>

Apa yang Anda dapatkan kembali adalah 10:30 BST, yaitu 9:30 GMT. Ini konsisten dengan database yang memperlakukan 10:30 dalam tabel sebagai nilai BST dan secara palsu mengonversinya ke GMT untuk Anda, sebelum Anda menguraikannya sebagai tanggal GMT. Itu adalah arah yang berlawanan dari nilai GMT yang secara palsu dikonversi ke BST.

Ini mungkin masalah khusus JDBC, karena JDBC mengharuskan waktu waktu dikonversi ke zona lokal. (Di mana MySQL C API tidak, mungkin karena tipe waktu klasik C tidak mengenali zona seperti Java.) Dan perlu tahu dari zona mana ia mengkonversi dari , demikian juga. MySQL TIMESTAMP type selalu disimpan sebagai UTC. Tapi itu tidak disebutkan untuk DATETIME Tipe. Saya berpikir yang menyiratkan bahwa MySQL akan menafsirkan DATETIME nilai kolom sebagai zona waktu server. Yang Anda sebutkan disetel ke BST, dan itu konsisten dengan arah pergeseran yang ditunjukkan dalam pesan kesalahan pernyataan Anda.

time_zone variabel sesi yang Anda atur memberi tahu server MySQL apa zona waktu mesin klien Anda, tetapi itu tidak memengaruhi apa yang server pikirkan tentang zona waktunya sendiri. Itu dapat diganti dengan serverTimezone Properti koneksi JDBC . Pada koneksi Anda, atur serverTimezone ke UTC, dan pastikan useLegacyDatetimeCode tidak aktif. (Dan lihat properti terkait zona lainnya jika itu tidak berhasil.) Lihat apakah itu membuat tanggal Anda muncul sebagai UTC dengan nilai bidang kalender yang sama seperti di database.

Ketahuilah bahwa ini akan mengubah interpretasi DATETIME lainnya nilai dalam database Anda:semuanya akan terlihat seperti tanggal UTC sekarang (dalam konteks koneksi JDBC Anda). Apakah itu benar akan tergantung pada bagaimana mereka awalnya diisi. Sementara kode klien Anda akan memiliki perilaku yang Anda inginkan, saya tidak tahu apakah sistem ini secara keseluruhan dapat dibuat untuk berperilaku sepenuhnya secara konsisten tanpa mengatur zona waktu server ke UTC di tingkat server. Pada dasarnya, jika zonanya tidak disetel ke UTC, itu tidak sepenuhnya dikonfigurasi untuk perilaku yang Anda inginkan, dan Anda mengelak di sekitarnya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa memperlambat dump MySQL agar tidak memengaruhi beban saat ini di server?

  2. Dapatkan jalur pohon di tabel MySQL

  3. Apakah ada JDBC mysql yang akan menghormati fetchSize?

  4. ImportError:Tidak ada modul bernama mysql.base, dalam proyek Django di server Ubuntu 11.04

  5. Mengapa Query MySQL ini hang?