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

JPA TemporalType.Date memberikan tanggal yang salah

Sangat menyesal tetapi semua jawaban sejauh ini umumnya salah. Jawabannya cukup sederhana tetapi mengharuskan kita memisahkan lima poin:

  1. DATE =java.sql.Date, yang merupakan pembungkus di sekitar java.util.Date yang merupakan jumlah milidetik sejak Epoch dalam zona waktu UTC. Jadi ini memiliki tahun/bulan/tanggal/jam/menit/detik dalam zona waktu GMT+0 (UTC) tetap. Namun perhatikan bahwa java.sql.Date menyetel komponen waktu ke nol!
  2. TIMESTAMP =java.sql.TimeStamp yang merupakan pembungkus komponen di sekitar Date yang menambahkan pecahan detik untuk mendukung standar tipe SQL DATE. Kelas/tipe ini tidak relevan atau diperlukan untuk pertanyaan ini tetapi singkatnya ini memiliki tanggal ditambah waktu.
  3. Database menyimpan objek DATE seperti yang didefinisikan (menggunakan UTC sebagai offset dari Java) tetapi mungkin menerjemahkan waktu jika dikonfigurasi dalam database berada di zona waktu yang berbeda. Secara default sebagian besar database default ke zona waktu server lokal, yang merupakan ide yang sangat buruk. Ladies, gentlemen ... SELALU simpan objek DATE di UTC. Baca terus...
  4. Waktu dalam JVM dan zona waktu harus tepat. Karena objek Date menggunakan UTC, apakah offset dihitung untuk waktu server Anda? Pertimbangkan bahwa dengan rekomendasi kuat bahwa waktu server disetel ke GMT+0 (UTC).
  5. Akhirnya ketika kita ingin merender DATE dari database (menggunakan JSF atau apapun), harus diatur menjadi zona waktu GMT+0 dan, jika dilakukan dari sisi server juga ... tanggal dan waktu Anda akan SELALU konsisten, referensial, dan semua hal baik. Yang tersisa hanyalah merender waktu dan INI adalah tempat agen-pengguna (untuk aplikasi web misalnya) bisa digunakan untuk menerjemahkan waktu GMT+0 ke zona waktu "lokal" pengguna.

Ringkasan:Gunakan UTC (GMT+0) di server, di database, di objek Java Anda.

DATE dan TIMESTAMP hanya berbeda dari perspektif database karena TIMESTAMP membawa tambahan sepersekian detik. Keduanya menggunakan GMT+0 (tersirat). JodaTime adalah kerangka kerja kalender yang lebih disukai untuk menangani semua ini, tetapi tidak akan memperbaiki masalah JVM yang tidak cocok dengan pengaturan zona waktu basis data.

Jika desain aplikasi dari JVM ke DB tidak menggunakan GMT, karena waktu musim panas, penyesuaian jam, dan semua jenis permainan regional lainnya yang dimainkan di jam lokal dunia ... waktu transaksi dan yang lainnya akan selamanya miring , non-referensial, tidak konsisten, dll.

Jawaban terkait lainnya yang bagus tentang tipe data:java.util .Tanggal vs java.sql.Tanggal

Perhatikan juga bahwa Java 8 memiliki pembaruan dengan penanganan tanggal/waktu yang lebih baik (akhirnya) tetapi ini tidak memperbaiki jam server tempat JVM berjalan berada di satu zona waktu dan database berada di zona waktu lain. Pada titik ini selalu terjadi penerjemahan. Di setiap klien besar (pintar) yang bekerja dengan saya, database dan zona waktu server JVM diatur ke UTC karena alasan ini, bahkan jika operasi mereka sebagian besar terjadi di beberapa zona waktu lain.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. xampp mysql Gagal menginisialisasi struktur multi master

  2. Bagaimana cara memilih antara hari pertama bulan ini dan hari ini di MySQL?

  3. Grup MySQL berdasarkan tanggal dan konversi dari cap waktu unix

  4. Bagaimana cara mendapatkan perbedaan tahun dari dua tanggal yang berbeda?

  5. Cara terbaik untuk menyimpan jam kerja dan menanyakannya secara efisien