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?
- Java SE 8
, Java SE 9
, Java SE 10
, Java SE 11
, dan yang lebih baru - Bagian dari Java API standar dengan implementasi yang dibundel.
- Java 9 menambahkan beberapa fitur dan perbaikan kecil.
- Java SE 6
dan Java SE 7
- Sebagian besar java.time fungsionalitas di-porting kembali ke Java 6 &7 di ThreeTen-Backport .
- Android
- Versi yang lebih baru dari implementasi bundel Android dari java.time kelas.
- Untuk Android sebelumnya (<26), ThreeTenABP proyek mengadaptasi ThreeTen-Backport (disebutkan di atas). Lihat Cara menggunakan ThreeTenABP… .
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
.