tl; dr
Proyek Joda-Time dalam mode pemeliharaan, sekarang digantikan oleh kelas java.time .
- Gunakan saja
java.time.Instant
kelas.
- Tidak perlu untuk:
LocalDateTime
java.sql.Timestamp
- String
Tangkap momen saat ini dalam UTC.
Instant.now()
Untuk menyimpan momen itu di database:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
Untuk mengambil momen itu dari database:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
Untuk menyesuaikan waktu jam dinding dengan zona waktu tertentu.
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
adalah kelas yang salah
Jawaban Lain benar, tetapi mereka gagal menunjukkan bahwa itu LocalDateTime
adalah kelas yang salah untuk tujuan Anda.
Baik di java.time dan Joda-Time , sebuah LocalDateTime
konsep zona waktu atau offset-from-UTC sengaja tidak ada. Dengan demikian, ini tidak mewakili suatu momen, dan bukan merupakan titik pada garis waktu. A LocalDateTime
mewakili gambaran kasar tentang momen potensial dalam rentang sekitar 26-27 jam.
Gunakan a LocalDateTime
untuk saat zona / offset tidak diketahui (bukan situasi yang baik), atau saat offset zona tidak dapat ditentukan. Misalnya, "Natal dimulai pada saat pertama tanggal 25 Desember 2018" akan direpresentasikan sebagai LocalDateTime
.
Gunakan a ZonedDateTime
untuk mewakili momen di zona waktu tertentu. Misalnya, Natal yang dimulai di zona tertentu seperti Pacific/Auckland
atau America/Montreal
akan diwakili dengan sebuah ZonedDateTime
objek.
Untuk sesaat selalu dalam UTC, gunakan Instant
.
Instant instant = Instant.now() ; // Capture the current moment in UTC.
Terapkan zona waktu. Momen yang sama, titik yang sama di garis waktu, tetapi dilihat dengan waktu jam dinding yang berbeda.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
Jadi, jika saya bisa mengonversi antara LocalDate dan LocalDateTime,
Tidak, strategi yang salah. Jika Anda memiliki nilai khusus tanggal, dan Anda menginginkan nilai tanggal-waktu, Anda harus menentukan waktu dalam sehari. Waktu hari itu mungkin tidak valid pada tanggal itu untuk zona tertentu - dalam hal ini ZonedDateTime
kelas secara otomatis menyesuaikan waktu sesuai kebutuhan.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Jika Anda ingin momen pertama hari itu sebagai waktu Anda, biarkan java.time menentukan momen itu. Jangan berasumsi bahwa hari dimulai pada 00:00:00. Anomali seperti Daylight Saving Time (DST) berarti hari dapat dimulai pada waktu lain seperti 01:00:00.
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp
adalah kelas yang salah
Ini java.sql.Timestamp
adalah bagian dari kelas tanggal-waktu lama bermasalah yang sekarang warisan, digantikan sepenuhnya oleh kelas java.time . Kelas itu digunakan untuk mewakili momen dalam UTC dengan resolusi nanodetik . Tujuan itu sekarang terlayani dengan java.time.Instant
.
JDBC 4.2 dengan getObject
/setObject
Mulai JDBC 4.2 dan yang lebih baru, driver JDBC Anda bisa langsung bertukar objek java.time dengan database dengan memanggil:
Sebagai contoh:
myPreparedStatement.setObject( … , instant ) ;
… Dan…
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Ubah warisan ⬌ modern
Jika Anda harus antarmuka dengan kode lama yang belum diperbarui ke java.time , ubah bolak-balik menggunakan metode baru yang ditambahkan ke kelas lama.
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
…dan…
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
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 kelas java.time .
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasinya adalah JSR 310 .
Anda dapat bertukar objek java.time langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu string, tidak perlu java.sql.*
kelas.
Di mana mendapatkan kelas java.time?
- Java SE 8 , Java SE 9 , dan yang lebih baru
- Bawaan.
- 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 fungsionalitas java.time di-back-port ke Java 6 & 7 di ThreeTen-Backport .
- Android
- Versi implementasi Android bundle kelas java.time yang lebih baru.
- Untuk Android sebelumnya (<26), yang ThreeTenABP proyek menyesuaikan ThreeTen-backport (disebutkan di atas). Lihat Cara menggunakan ThreeTenABP… .
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 .
java.sql.Timestamp
kelas tersebut sekarang sudah lama, digantikan oleh kelas java.time , khususnya olehInstant
.