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 LocalDateTimeadalah kelas yang salah untuk tujuan Anda.
Baik di java.time dan Joda-Time , sebuah LocalDateTimekonsep zona waktu atau offset-from-UTC sengaja tidak ada. Dengan demikian, ini tidak mewakili suatu momen, dan bukan merupakan titik pada garis waktu. A LocalDateTimemewakili gambaran kasar tentang momen potensial dalam rentang sekitar 26-27 jam.
Gunakan a LocalDateTimeuntuk 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 ZonedDateTimeuntuk mewakili momen di zona waktu tertentu. Misalnya, Natal yang dimulai di zona tertentu seperti Pacific/Aucklandatau America/Montrealakan diwakili dengan sebuah ZonedDateTimeobjek.
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 ZonedDateTimekelas 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.Timestampadalah 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.Timestampkelas tersebut sekarang sudah lama, digantikan oleh kelas java.time , khususnya olehInstant.