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

JPA Menyimpan tanggal yang salah di database MySQL

tl;dr

Gunakan JPA 2.2 atas dukungannya terhadap java.time .

Gunakan kelas hanya tanggal di Java untuk bekerja dengan nilai hanya tanggal di SQL.

LocalDate                           // Represent a date-only, without a time-of-day and without a time zone.
.now(                               // Get today's date…
    ZoneId.of( "Africa/Tunis" )     // …as seen in the wall-clock time used by the people of a particular region.
)                                   // Returns a `LocalDate` object.
.plusMonths( 1 )                    // Returns another `LocalDate` object, per immutable objects pattern.

java.time

JPA 2.2 sekarang mendukung java.time modern modern kelas. Tidak perlu menggunakan Joda-Time lagi.

Jangan jangan gunakan java.sql.Date . Kelas itu berpura-pura untuk mewakili tanggal saja tetapi sebenarnya memiliki waktu hari yang disetel ke UTC karena keputusan desain yang buruk untuk mewarisi dari java.util.Date (yang meskipun namanya mewakili tanggal dan waktu hari dan offset nol untuk UTC itu sendiri). Kelas-kelas warisan ini adalah kekacauan yang mengerikan. Sun, Oracle, dan komunitas JCP semuanya menyerah pada kelas tesis bertahun-tahun yang lalu dengan adopsi JSR 310, dan Anda juga harus demikian.

LocalDate

LocalDate class mewakili nilai hanya tanggal tanpa waktu dan tanpa zona waktu atau offset-from-UTC .

Zona waktu sangat penting dalam menentukan tanggal. Untuk saat tertentu, tanggal bervariasi di seluruh dunia menurut zona. Misalnya, beberapa menit setelah tengah malam di Paris Prancis adalah hari baru saat masih “kemarin” di Montréal Québec .

Jika tidak ada zona waktu yang ditentukan, JVM secara implisit menerapkan zona waktu default saat ini. Default itu mungkin ubah setiap saat selama runtime(!), sehingga hasil Anda mungkin berbeda. Lebih baik tentukan zona waktu yang Anda inginkan/harapkan secara eksplisit sebagai argumen. Jika kritis, konfirmasikan zona tersebut dengan pengguna Anda.

Tentukan nama zona waktu yang tepat dalam format Continent/Region , seperti America/Montreal , Africa/Casablanca , atau Pacific/Auckland . Jangan pernah menggunakan singkatan 2-4 huruf seperti EST atau IST karena mereka tidak zona waktu yang sebenarnya, tidak standar, dan bahkan tidak unik(!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

Jika Anda ingin menggunakan zona waktu default JVM saat ini, mintalah dan berikan sebagai argumen. Jika dihilangkan, kode menjadi ambigu untuk dibaca karena kami tidak tahu pasti apakah Anda bermaksud menggunakan default atau jika Anda, seperti banyak programmer, tidak mengetahui masalah ini.

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Atau tentukan tanggal. Anda dapat mengatur bulan dengan angka, dengan penomoran waras 1-12 untuk Januari-Desember.

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

Atau, lebih baik, gunakan Month enum objek yang telah ditentukan sebelumnya, satu untuk setiap bulan dalam setahun. Kiat:Gunakan Month ini objek di seluruh basis kode Anda daripada sekadar angka integer untuk membuat kode Anda lebih terdokumentasi sendiri, memastikan nilai yang valid, dan memberikan keamanan jenis . Sama untuk Year &YearMonth .

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

Matematika tanggal-waktu

Tampaknya Anda ingin memulai dengan satu tanggal dan mendapatkan satu bulan kemudian sebagai rentang tanggal.

LocalDate monthLater = ld.plusMonths( 1 ) ;

JDBC 4.2

Mulai JDBC 4.2, driver JDBC Anda diperlukan untuk mendukung beberapa kunci java.time kelas seperti LocalDate .

Rentang tanggal

Perhatikan tautan di bawah untuk ThreeTen-Extra . Anda mungkin menemukan LocalDateRange kelas di sana akan berguna jika Anda melakukan banyak pekerjaan dengan rentang tanggal.

Tentang java.time

java.time framework dibangun ke dalam Java 8 dan yang lebih baru. Kelas-kelas ini menggantikan warisan lama yang merepotkan kelas tanggal-waktu seperti java.util.Date , Calendar , &SimpleDateFormat .

Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasinya adalah JSR 310 .

Joda-Time proyek, sekarang dalam mode pemeliharaan , menyarankan migrasi ke java.time kelas.

Anda dapat menukar java.time objek langsung dengan database Anda. Gunakan driver JDBC sesuai dengan JDBC 4.2 atau nanti. Tidak perlu string, tidak perlu java.sql.* kelas.

Di mana mendapatkan kelas Java.time?

ThreeTen-Extra proyek memperluas Java.time dengan kelas tambahan. Proyek ini adalah tempat pembuktian untuk kemungkinan penambahan Java.time di masa mendatang. Anda mungkin menemukan beberapa kelas yang berguna di sini seperti Interval , YearWeek , YearQuarter , dan lainnya .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Baris Perintah PHP mysql_connect() Kesalahan

  2. MySQL Gabung Dimana Tidak Ada

  3. Nama tabel sensitivitas huruf MySQL di MacOS dengan sistem file tidak peka huruf besar-kecil

  4. Bagaimana cara mendapatkan ID Variasi Woocommerce?

  5. Bantuan dengan kueri SQL untuk menemukan tanggal berikutnya yang tersedia untuk sistem reservasi