Tukar java.util.Tarikh ke Rentetan

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan menunjukkan bagaimana kita dapat menukar objek Date ke objek String di Java . Untuk melakukannya, kami akan bekerjasama dengan jenis java.util.Date yang lebih lama dan juga dengan API Tarikh / Masa baru yang diperkenalkan di Java 8.

Sekiranya anda ingin belajar bagaimana melakukan penukaran sebaliknya, iaitu dari jenis String to Date , anda boleh melihat tutorial ini di sini.

Untuk maklumat lebih lanjut mengenai API Tarikh / Masa baru , sila lihat tutorial berkaitan ini.

2. Menukar java.util.Date to String

Walaupun kita tidak boleh menggunakan java.util.Date jika kita bekerja dengan Java 8, kadang-kadang kita tidak mempunyai pilihan (misalnya, kita menerima objek Date dari perpustakaan yang tidak ada dalam kawalan kita).

Dalam kes seperti ini, kita mempunyai beberapa cara untuk menukar java.util.Date ke String yang boleh kita gunakan.

2.1. Menyiapkan Objek Tarikh

Mari kita nyatakan representasi String yang diharapkan dari tarikh kita dan tentukan corak format tarikh yang diinginkan:

private static final String EXPECTED_STRING_DATE = "Aug 1, 2018 12:00 PM"; private static final String DATE_FORMAT = "MMM d, yyyy HH:mm a";

Sekarang kita memerlukan objek Tarikh sebenar yang ingin kita tukar. Kami akan menggunakan contoh Kalendar untuk membuatnya:

TimeZone.setDefault(TimeZone.getTimeZone("CET")); Calendar calendar = Calendar.getInstance(); calendar.set(2018, Calendar.AUGUST, 1, 12, 0); Date date = calendar.getTime();

Kami telah menetapkan TimeZone lalai ke CET untuk mengelakkan masalah ketika bekerja dengan API baru nanti. Kita harus sedar bahawa yang Tarikh sendiri tidak mempunyai zon masa, tetapi yang toString () menggunakan zon masa lalai semasa .

Kami akan menggunakan contoh Tarikh ini dalam semua contoh kami di bawah.

2.2. Menggunakan Kelas SimpleDateFormat

Kami akan gunakan format () kaedah yang SimpleDateFormat kelas dalam contoh ini. Mari buat contoh dengan menggunakan format tarikh kami:

DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);

Selepas ini, kita dapat memformat tarikh kita dan membandingkannya dengan output yang diharapkan:

String formattedDate = formatter.format(date); assertEquals(EXPECTED_STRING_DATE, formattedDate);

2.3. Menggunakan Kelas DateFormat Abstrak

Seperti yang kita boleh lihat, SimpleDateFormat adalah subkelas abstrak dateformat kelas. Kelas ini menyediakan pelbagai kaedah untuk format tarikh dan masa.

Kami akan menggunakannya untuk mencapai output yang sama seperti di atas:

String formattedDate = DateFormat .getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT) .format(date);

Dengan pendekatan ini, kami menggunakan corak gaya - MEDIUM untuk tarikh dan PENDEK untuk masa ini.

3. Menggunakan Kelas Formatter

Kaedah mudah lain untuk mendapatkan String yang sama seperti pada contoh sebelumnya adalah dengan menggunakan kelas Formatter .

Walaupun ini mungkin bukan penyelesaian yang paling mudah dibaca, ia adalah satu-liner yang selamat untuk utas yang mungkin berguna, terutamanya dalam persekitaran multi- utas (kita harus ingat bahawa SimpleDateFormat tidak selamat untuk benang):

String formattedDate = String.format("%1$tb %1$te, %1$tY %1$tI:%1$tM %1$Tp", date);

Kami menggunakan 1 $ untuk menunjukkan bahawa kami hanya akan menyampaikan satu argumen untuk digunakan dengan setiap bendera. Penjelasan terperinci mengenai bendera boleh didapati di bahagian Penukaran Tarikh / Masa dari kelas Formatter .

4. Menukar Menggunakan Java 8 API Tarikh / Masa

The Tarikh / Masa API dari Jawa 8 adalah jauh lebih berkuasa daripada java.util.Date dan java.util.Calendar kelas, dan kita perlu menggunakannya apabila mungkin. Mari lihat bagaimana kita dapat menggunakannya untuk menukar objek Tarikh kita yang ada ke String .

Kali ini, kami akan menggunakan kelas DateTimeFormatter dan kaedah formatnya () , serta corak tarikh yang sama, yang dinyatakan dalam Bahagian 2.1:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);

Untuk menggunakan API baru, kita perlu menukar objek Tarikh kita ke objek Segera :

Instant instant = date.toInstant();

Oleh kerana String yang diharapkan kami mempunyai bahagian tarikh dan waktu, kami juga perlu menukar objek Instant ke LocalDateTime :

LocalDateTime ldt = instant .atZone(ZoneId.of("CET")) .toLocalDateTime();

Dan akhirnya, kita dapat memperoleh String berformat kita dengan mudah :

String formattedDate = ldt.format(formatter);

5. Kesimpulan

Dalam artikel ini, kami menggambarkan beberapa cara menukar objek java.util.Date ke String . Kami pertama menunjukkan bagaimana untuk berbuat demikian menggunakan lebih tua java.util.Date dan java.util.Calendar kelas dan sama kelas tarikh pemformatan.

Kemudian kami menggunakan kelas Formatter dan akhirnya API Java 8 Date / Time.

Seperti biasa, kod sumber lengkap boleh didapati di GitHub.