Saya menggunakan JodaTime 1.6.2.
Saya memiliki LocalDate
yang perlu saya ubah menjadi (Joda) LocalDateTime
, atau java.sqlTimestamp
untuk ormapping.
Alasannya adalah saya telah menemukan cara mengonversi antara a LocalDateTime
dan a java.sql.Timestamp
:
LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));
Jadi, jika saya dapat mengonversi antara LocalDate
dan LocalDateTime
, maka saya dapat membuat konversi lanjutan ke java.sql.Timestamp
. Terima kasih atas dorongan ke arah yang benar!
java.sql.Timestamp
kelas tersebut sekarang sudah lama, digantikan oleh kelas java.time , khususnya olehInstant
.Jawaban:
JodaTime
Untuk mengonversi JodaTime
org.joda.time.LocalDate
menjadijava.sql.Timestamp
, lakukan sajaUntuk mengonversi JodaTime
org.joda.time.LocalDateTime
menjadijava.sql.Timestamp
, lakukan sajaJavaTime
Untuk mengonversi Java8
java.time.LocalDate
menjadijava.sql.Timestamp
, lakukan sajaUntuk mengonversi Java8
java.time.LocalDateTime
menjadijava.sql.Timestamp
, lakukan sajasumber
LocalDateTime
menjadiDateTime
karena tidak semuaLocalDateTime
s validDateTime
. Sumber: joda-time.sourceforge.net/faq.html#illegalinstant dan baru saja menemukan ini.Timestamp#valueOf()
metode ini menerima karena Java SE 1.8 juga aLocalDateTime
.Cara terbaik menggunakan Java 8 time API:
Untuk digunakan dengan JPA yang disertakan dengan model Anda ( https://weblogs.java.net/blog/montanajava/archive/2014/06/17/using-java-8-datetime-classes-jpa ):
Jadi sekarang waktu relatif zona waktu independen. Selain itu mudah dilakukan:
Pemformatan:
UPDATE: postgres 9.4.1208, HSQLDB 2.4.0 dll memahami Java 8 Time API tanpa percakapan apa pun!
sumber
tl; dr
Proyek Joda-Time dalam mode pemeliharaan, sekarang digantikan oleh kelas java.time .
java.time.Instant
kelas.LocalDateTime
java.sql.Timestamp
Tangkap momen saat ini dalam UTC.
Untuk menyimpan momen itu di database:
Untuk mengambil momen itu dari database:
Untuk menyesuaikan waktu jam dinding dengan zona waktu tertentu.
LocalDateTime
adalah kelas yang salahJawaban 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. ALocalDateTime
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 sebagaiLocalDateTime
.Gunakan a
ZonedDateTime
untuk mewakili momen di zona waktu tertentu. Misalnya, Natal yang dimulai di zona tertentu sepertiPacific/Auckland
atauAmerica/Montreal
akan diwakili dengan sebuahZonedDateTime
objek.Untuk sesaat selalu dalam UTC, gunakan
Instant
.Terapkan zona waktu. Momen yang sama, titik yang sama di garis waktu, tetapi dilihat dengan waktu jam dinding yang berbeda.
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.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.
java.sql.Timestamp
adalah kelas yang salahIni
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 denganjava.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:
PreparedStatement::setObject
ResultSet::getObject
Sebagai contoh:
… Dan…
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.
…dan…
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?
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 .sumber
Bergantung pada zona waktu Anda, Anda mungkin kehilangan beberapa menit (1650-01-01 00:00:00 menjadi 1649-12-31 23:52:58)
Gunakan kode berikut untuk menghindarinya
sumber
Karena Joda semakin pudar, seseorang mungkin ingin mengonversi
LocaltDate
keLocalDateTime
di Java 8. Di Java 8,LocalDateTime
ini akan memberikan cara untuk membuatLocalDateTime
instance menggunakanLocalDate
danLocalTime
. Cek di sini.Sampel akan menjadi,
Sekadar referensi, Untuk mendapatkan epoch detik di bawah ini bisa digunakan,
sumber
LocalDateTime
sama sekali di sini. Kelas itu sengaja tidak memiliki konsep zona waktu atau offset-dari-UTC. Jadi tidak ada gunanya di sini. Sebaliknya:LocalDate.parse( “20180306” , DateTimeFormatter.BASIC_ISO_DATE ).atStartOfDay( ZoneId.of( “Africa/Tunis” ).toEpochSecond()
Jangan menganggap hari dimulai pukul 00.00, tidak selalu demikian.java.time.LocalDate.atStartOfDay
untuk mendapatkan fileZonedDateTime
. Lihat contoh di Jawaban saya . Seperti yang saya komentari,LocalDateTime
kelas tidak berguna dan kontra-produktif dalam semua ini.LocalDateTime
kita harus menggunakan aZoneId
?LocalDateTime
yang tidak yang sesuai untuk masalah yang dihadapi di sini. SebuahLocalDateTime
tidak tidak mewakili sejenak. SebuahLocalDateTime
memiliki apa-apa hubungannya dengan lokalitas tertentu atau zona waktu meskipun nama mungkin menyiratkan sebaliknya pada pandangan pertama - mempelajari lebih lanjut tentang maksud dan rincian dari kelas ini. TheLocalDateTime
kelas tidak melayani tujuan, tetapi bukan tujuan terlihat dalam pertanyaan ini.fungsi panggilan
asStartOfDay()
padajava.time.LocalDate
objek mengembalikanjava.time.LocalDateTime
objeksumber
Java8 +
sumber