tl;dr
myPreparedStatement
.setObject(
… , // Specify which placeholder `?` in your SQL statement.
OffsetDateTime.now( ZoneOffset.UTC ) // Capture the current moment as seen in the wall-clock time of UTC (an offset-from-UTC of zero).
) ;
Hindari kelas tanggal-waktu lama
Anda menggunakan kelas tanggal-waktu yang mengerikan yang digantikan bertahun-tahun yang lalu oleh java.time kelas.
Jangan pernah menggunakan Date
atau Timestamp
.
UTC
Abadikan momen saat ini, dalam UTC. Sebagian besar basis data menyimpan momen dalam UTC. Dan umumnya Anda harus melakukan sebagian besar logika bisnis, debugging, logging, penyimpanan, dan pertukaran data di UTC.
OffsetDateTime
Mewakili momen dengan offset-from-UTC menggunakan OffsetDateTime
yang bernama tepat kelas.
Kami ingin UTC itu sendiri, atau offset nol. Kita dapat menggunakan konstanta untuk itu, ZoneOffset.UTC
.
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ) ;
JDBC 4.2
Mulai JDBC 4.2 kita bisa langsung menukar java.time objek dengan database.
Untuk menyimpan momen ini ke kolom tipe data yang mirip dengan TIMESTAMP WITH TIME ZONE
standar SQL :
myPreparedStatement.setObject( … , odt ) ;
Pengambilan:
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
ZonedDateTime
Untuk menyajikan momen yang diambil ini kepada pengguna, Anda mungkin ingin menyesuaikan dengan zona waktu yang diharapkan/diinginkan pengguna.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
Jangan pernah mengandalkan zona waktu default
Perhatikan pada kode di atas bahwa kami selalu menentukan offset atau zona yang diinginkan/diharapkan.
Jika Anda tidak menentukan, offset atau zona diterapkan secara implisit secara diam-diam. Lebih baik tentukan niat Anda secara eksplisit karena default JVM, database, dan OS host Anda saat ini berada di luar kendali Anda sebagai seorang programmer. Yang berarti kode yang mengandalkan default akan bervariasi dalam perilaku saat runtime.
Java 6 &7
Orang yang sama, Stephen Colebourne, yang memimpin JSR 310 dan java.time implementasi, serta Joda-Time yang terkenal proyek, juga memimpin proyek lain, ThreeTen-Backport . Sebagian besar java.time fungsionalitas di-porting kembali ke Java 6 &7 di perpustakaan ini, dengan API yang hampir identik.
Jadi lakukan semua pekerjaan Anda di kelas back-port. Kemudian, pada saat terakhir, konversikan ke/dari java.sql.Timestamp
melalui DateTimeUtils
kelas.
Metode konversi tersebut kebanyakan menggunakan Instant
objek. Sebuah Instant
adalah momen di UTC, selalu di UTC. Anda dapat menyesuaikan dari OffsetDateTime
ke UTC dengan mengekstrak Instant
. Instant
class adalah kelas blok pembangun dasar di java.time , dengan OffsetDateDate
memiliki lebih banyak fleksibilitas seperti pola pemformatan alternatif saat membuat string. Tapi keduanya Instant
dan OffsetDateTime
mewakili momen, titik pada timeline.
Instant instant = odt.toInstant() ;
java.sql.Timestamp ts = org.threeten.bp.DateTimeUtils.toSqlTimestamp( instant ) ;
Pergi ke arah lain, mengambil Timestamp
dari database Anda, lalu segera mengonversi ke Instant
.
java.sql.Timestamp ts = myResultSet.getTimestamp( … ) ;
Instant instant = org.threeten.bp.DateTimeUtils.toInstant( ts ) ;
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
.
Joda-Time proyek, sekarang dalam mode pemeliharaan , menyarankan migrasi ke java.time kelas.
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasinya adalah JSR 310 .
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 Android bundle 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
.