tl; dr
Gunakan hanya kelas java.time modern . Tidak pernah menggunakan kelas warisan yang mengerikan seperti SimpleDateFormat
, Date
, atau java.sql.Timestamp
.
ZonedDateTime // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now( // Capture the current moment.
ZoneId.of( "Africa/Tunis" ) // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST.
) // Returns a `ZonedDateTime` object.
.format( // Generate a `String` object containing text representing the value of our date-time object.
DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
) // Returns a `String`.
Atau gunakan zona waktu default JVM saat ini.
ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )
java.time & JDBC 4.2
Pendekatan modern menggunakan kelas java.time seperti yang terlihat di atas.
Jika driver JDBC Anda sesuai dengan JDBC 4.2 , Anda dapat langsung bertukar objek java.time dengan database. Gunakan PreparedStatement::setObject
dan ResultSet::getObject
.
Gunakan java.sql hanya untuk driver sebelum JDBC 4.2
Jika driver JDBC Anda belum mematuhi JDBC 4.2 untuk dukungan tipe java.time , Anda harus kembali menggunakan kelas java.sql.
Menyimpan data.
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ; // Capture the current moment in UTC.
myPreparedStatement.setObject( … , odt ) ;
Mengambil data.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Tipe java.sql, seperti java.sql.Timestamp
, seharusnya hanya digunakan untuk transfer masuk dan keluar dari database. Segera konversi ke tipe java.time di Java 8 dan yang lebih baru.
java.time.Instant
A java.sql.Timestamp
memetakan ke java.time.Instant
, sesaat pada timeline di UTC. Perhatikan metode konversi baru yang toInstant
ditambahkan ke kelas lama.
java.sql.Timestamp ts = myResultSet.getTimestamp( … );
Instant instant = ts.toInstant();
Zona waktu
Terapkan zona waktu yang diinginkan / diharapkan ( ZoneId
) untuk mendapatkan a ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
String Terformat
Gunakan a DateTimeFormatter
untuk menghasilkan string Anda. Kode polanya mirip dengan yang ada java.text.SimpleDateFormat
tetapi tidak persis, jadi baca dokumen dengan cermat.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );
Format khusus ini tidak jelas untuk arti persisnya karena tidak memiliki indikasi offset-dari-UTC atau zona waktu.
ISO 8601
Jika Anda memiliki hak suara dalam masalah ini, saya sarankan Anda mempertimbangkan untuk menggunakan format standar ISO 8601 daripada menggulirkan sendiri. Format standar sangat mirip dengan Anda. Sebagai contoh:
2016-02-20T03:26:32+05:30
.
Kelas java.time menggunakan format standar ini secara default, jadi tidak perlu menentukan pola. The ZonedDateTime
kelas meluas format standar dengan menambahkan nama zona waktu (perbaikan bijaksana).
String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]
Konversikan ke java.sql
Anda dapat mengonversi dari java.time kembali ke java.sql.Timestamp
. Ekstrak Instant
dari ZonedDateTime
.
Metode baru telah ditambahkan ke kelas lama untuk memfasilitasi konversi ke / dari kelas java.time.
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );
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. Spesifikasi adalah JSR 310 .
Anda dapat bertukar objek java.time secara langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu untuk string, tidak perlu untuk java.sql.*
kelas.
Di mana mendapatkan kelas java.time?
Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval
, YearWeek
, YearQuarter
, dan lebih .