java.time
Pendekatan modern menggunakan kelas java.time yang menggantikan kelas tanggal-waktu lama yang merepotkan yang digabungkan dengan versi Java yang paling awal.
The java.sql.Timestamp
kelas adalah salah satu kelas warisan. Tidak lagi dibutuhkan. Sebagai gantinya gunakan Instant
atau kelas java.time lainnya secara langsung dengan database Anda menggunakan JDBC 4.2 dan yang lebih baru.
The Instant
kelas merupakan saat di timeline di UTC dengan resolusi nanodetik (hingga sembilan (9) angka dari pecahan desimal).
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Jika Anda harus beroperasi dengan yang sudah ada Timestamp
, segera ubah menjadi java.time melalui metode konversi baru yang ditambahkan ke kelas lama.
Instant instant = myTimestamp.toInstant() ;
Untuk menyesuaikan dengan zona waktu lain, tentukan zona waktu sebagai ZoneId
objek. Tentukan nama zona waktu yang tepat dalam format continent/region
, seperti America/Montreal
,Africa/Casablanca
, atau Pacific/Auckland
. Jangan pernah menggunakan 3-4 huruf pseudo-zone seperti EST
atau IST
karena itu bukan zona waktu yang sebenarnya, tidak terstandarisasi, dan bahkan tidak unik (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Terapkan ke Instant
untuk menghasilkan ZonedDateTime
objek.
ZonedDateTime zdt = instant.atZone( z ) ;
Untuk menghasilkan string untuk ditampilkan kepada pengguna, telusuri Stack Overflow untuk DateTimeFormatter
menemukan banyak diskusi dan contoh.
Pertanyaan Anda benar-benar tentang pergi ke arah lain, dari entri data pengguna ke objek tanggal-waktu. Umumnya paling baik untuk memecah entri data Anda menjadi dua bagian, tanggal dan waktu.
LocalDate ld = LocalDate.parse( dateInput , DateTimeFormatter.ofPattern( "M/d/uuuu" , Locale.US ) ) ;
LocalTime lt = LocalTime.parse( timeInput , DateTimeFormatter.ofPattern( "H:m a" , Locale.US ) ) ;
Pertanyaanmu tidak jelas. Apakah Anda ingin mengartikan tanggal dan waktu yang dimasukkan oleh pengguna sebagai UTC? Atau di zona waktu lain?
Jika yang Anda maksud adalah UTC, buat file OffsetDateTime
dengan offset menggunakan konstanta untuk UTC ZoneOffset.UTC
,.
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;
Jika yang Anda maksud zona waktu lain, gabungkan dengan objek zona waktu, a ZoneId
. Tapi zona waktu yang mana? Anda mungkin mendeteksi zona waktu default. Atau, jika penting, Anda harus mengonfirmasi dengan pengguna untuk memastikan niat mereka.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Untuk mendapatkan objek yang lebih sederhana yang selalu dalam UTC menurut definisi, ekstrak file Instant
.
Instant instant = odt.toInstant() ;
…atau…
Instant instant = zdt.toInstant() ;
Kirim ke database Anda.
myPreparedStatement.setObject( … , instant ) ;
Tentang java.time
The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti java.util.Date
, Calendar
, &SimpleDateFormat
.
Proyek Joda-Time , 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 .
Dimana mendapatkan kelas java.time?
Proyek ThreeTen-Extra memperluas java.time dengan kelas tambahan. Proyek ini adalah tempat pembuktian untuk kemungkinan penambahan java.time di masa mendatang. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval
, YearWeek
, YearQuarter
, dan lebih .