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.Datemenjadi Instant. The Instantkelas 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.Datedan java.time.Instantberada di UTC . Jika Anda ingin melihat tanggal dan waktu sebagai UTC, biarkan saja. Panggilan toStringuntuk menghasilkan sebuah String dalam format standar ISO 8601 .
String output = instant.toString();
2014-11-14T14: 05: 09Z
Untuk format lain, Anda perlu mengubah Anda Instantmenjadi 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 Toutputnya 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 ZoneIduntuk 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 odtdengan 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 DateTimeFormatterobjek 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.