tl; dr
myUtilDate.toInstant() // Convert `java.util.Date` to `Instant`.
.atOffset( ZoneOffset.UTC ) // Transform `Instant` to `OffsetDateTime`.
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // Generate a String.
.replace( "T" , " " ) // Put a SPACE in the middle.
2014-11-14 14:05:09
waktu java
Cara modern adalah dengan kelas java.time yang sekarang menggantikan kelas tanggal lama waktu lama yang merepotkan.
Konversi dulu java.util.Date
menjadi Instant
. The Instant
kelas merupakan saat di timeline di UTC dengan resolusi nanodetik (hingga sembilan (9) angka dari pecahan desimal).
Konversi ke / dari java.time dilakukan dengan metode baru yang ditambahkan ke kelas lama.
Instant instant = myUtilDate.toInstant();
Baik Anda java.util.Date
dan java.time.Instant
berada di UTC . Jika Anda ingin melihat tanggal dan waktu sebagai UTC, biarkan saja. Panggilan toString
untuk menghasilkan sebuah String dalam format standar ISO 8601 .
String output = instant.toString();
2014-11-14T14: 05: 09Z
Untuk format lain, Anda perlu mengubah Anda Instant
menjadi lebih fleksibel OffsetDateTime
.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
odt.toString (): 2020-05-01T21: 25: 35.957Z
Lihat kode dijalankan langsung di IdeOne.com .
Untuk mendapatkan String dalam format yang Anda inginkan, tentukan a DateTimeFormatter
. Anda dapat menentukan format khusus. Tapi saya akan menggunakan salah satu formatters yang telah ditentukan ( ISO_LOCAL_DATE_TIME
), dan mengganti T
outputnya dengan SPACE.
String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );
2014-11-14 14:05:09
Ngomong-ngomong saya tidak merekomendasikan format seperti ini di mana Anda sengaja kehilangan informasi offset-dari-UTC atau zona waktu. Menciptakan ambiguitas tentang makna nilai tanggal-waktu string itu.
Waspadalah juga terhadap kehilangan data, karena setiap pecahan detik diabaikan (secara efektif terpotong) dalam representasi String Anda tentang nilai tanggal-waktu.
Untuk melihat momen yang sama melalui lensa waktu jam dinding wilayah tertentu , terapkan a ZoneId
untuk mendapatkan ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [Amerika / Montreal]
Untuk menghasilkan String yang diformat, lakukan hal yang sama seperti di atas tetapi ganti odt
dengan zdt
.
String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " );
2014-11-14 14:05:09
Jika mengeksekusi kode ini berkali-kali, Anda mungkin ingin menjadi sedikit lebih efisien dan menghindari panggilan String::replace
. Menjatuhkan panggilan itu juga membuat kode Anda lebih pendek. Jika diinginkan, tentukan pola pemformatan Anda sendiri di DateTimeFormatter
objek Anda sendiri . Tembolok instance ini sebagai konstanta atau anggota untuk digunakan kembali.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ); // Data-loss: Dropping any fractional second.
Terapkan formatter itu dengan melewatkan instance.
String output = zdt.format( f );
Tentang java.time
The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan kelas tanggal-waktu lama merepotkan seperti java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
.
Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke java.time.
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan.
Sebagian besar fungsi java.time di-portingkan ke Java 6 & 7 di ThreeTen-Backport dan selanjutnya diadaptasi ke Android di ThreeTenABP (lihat Cara menggunakan ... ).
Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time.