tl; dr
String sql = "SELECT CURRENT_TIMESTAMP ;
…
OffsetDateTime odt = myResultSet.getObject( 1 , OffsetDateTime.class ) ;
Hindari bergantung pada OS host atau JVM untuk zona waktu default
Saya sarankan Anda menulis semua kode Anda untuk secara eksplisit menyatakan zona waktu yang diinginkan / diharapkan. Anda tidak perlu bergantung pada zona waktu default JVM saat ini. Dan ketahuilah bahwa zona waktu default JVM saat ini dapat berubah kapan saja selama waktu proses , dengan kode apa pun di utas apa pun dari panggilan aplikasi apa pun TimeZone.setDefault
. Panggilan semacam itu segera memengaruhi semua aplikasi dalam JVM tersebut.
java.time
Beberapa Jawaban lain benar, tetapi sekarang sudah ketinggalan zaman. Kelas tanggal-waktu yang mengerikan yang digabungkan dengan versi Java yang paling awal memiliki cacat, ditulis oleh orang-orang yang tidak memahami kerumitan dan seluk-beluk penanganan waktu-tanggal.
Kelas tanggal-waktu warisan telah digantikan oleh kelas java.time yang ditentukan di JSR 310.
Untuk mewakili zona waktu, gunakan ZoneId
. Untuk merepresentasikan offset-from-UTC, gunakan ZoneOffset
. Offset hanyalah beberapa jam-menit-detik di depan atau di belakang meridian utama. Zona waktu lebih dari itu. Zona waktu adalah sejarah perubahan masa lalu, sekarang, dan masa depan untuk offset yang digunakan oleh orang-orang di wilayah tertentu.
Saya perlu memaksakan operasi terkait waktu ke GMT / UTC
Untuk offset nol jam-menit-detik, gunakan konstanta ZoneOffset.UTC
.
Instant
Untuk menangkap momen saat ini di UTC, gunakan Instant
. Kelas ini mewakili momen dalam UTC, selalu dalam UTC menurut definisi.
Instant instant = Instant.now() ; // Capture current moment in UTC.
ZonedDateTime
Untuk melihat momen yang sama melalui jam dinding yang digunakan oleh orang-orang di wilayah tertentu, sesuaikan dengan zona waktu. Momen yang sama, titik yang sama di garis waktu, waktu jam dinding yang berbeda.
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Database
Anda menyebutkan database.
Untuk mengambil momen dari database, kolom Anda harus dari tipe data yang mirip dengan standar SQL TIMESTAMP WITH TIME ZONE
. Mengambil objek, bukan string. Di JDBC 4.2 dan yang lebih baru, kita dapat bertukar objek java.time dengan database. The OffsetDateTime
diperlukan oleh JDBC, sementara Instant
& ZonedDateTime
adalah opsional.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Di sebagian besar database dan driver, saya rasa Anda akan mendapatkan momen seperti yang terlihat di UTC. Namun jika tidak, Anda dapat menyesuaikan dengan salah satu dari dua cara berikut:
- Ekstrak a
Instant
: odt.toInstant()
- Sesuaikan dari offset yang diberikan ke offset nol: OffsetDateTime odtUtc = odt.withOffsetSameInstant (ZoneOffset.UTC); `.
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
.
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasinya adalah JSR 310 .
Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .
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.
Dimana mendapatkan kelas java.time?