Tipe salah
LocalDateTime
adalah jenis yang salah di sini. Kelas itu tidak dapat mewakili momen, seperti yang dijelaskan dalam Javadoc-nya.
Kelas itu sengaja tidak memiliki konsep zona waktu atau offset-dari-UTC. Jadi itu mewakili tanggal dan waktu seperti "siang pada 23 Januari 2019", tetapi tidak tahu apakah itu siang di Tokyo, Paris, atau Montréal, misalnya, tiga momen yang sangat berbeda itu adalah beberapa jam terpisah. Jadi tipe ini cocok untuk tipe SQL standar TIMESTAMP WITHOUT TIME ZONE
– tanpa , bukan dengan .
Untuk diskusi lebih lanjut, lihat:Apa perbedaan antara Instant dan LocalDateTime?
Tipe kanan
Untuk tipe SQL standar TIMESTAMP WITH TIME ZONE
, Anda harus menggunakan tipe Java Instant
, OffsetDateTime
, atau ZonedDateTime
. Dari ketiganya, JDBC 4.2 hanya membutuhkan dukungan untuk yang kedua, OffsetDateTime
.
Pengambilan.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Nilai yang diambil dari Postgres akan selalu dalam UTC. Standar SQL tidak menentukan perilaku ini, sehingga database bervariasi. Di Postgres, nilai apa pun yang dikirim ke bidang jenis TIMESTAMP WITH TIME ZONE
disesuaikan dengan UTC. Nilai yang diambil ada dalam UTC.
Menyimpan.
myPreparedStatement.setObject( … , odt ) ;
Sesuaikan dari UTC (offset nol) ke waktu jam dinding yang digunakan oleh orang-orang di wilayah tertentu (zona waktu).
ZoneId z = ZoneId.of( "Asia/Tokyo" ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
JPA
Saya tidak menggunakan JPA, lebih memilih untuk menjaga hal-hal sederhana.
Tetapi menurut Jawaban ini , JPA 2.2 mendukung java.time jenis.
Hibernasi juga mendukung java.time .