Panduan untuk DateTimeFormatter

1. Ikhtisar

Dalam tutorial ini, kita akan meninjau kelas Java 8 DateTimeFormatter dan pola pemformatannya . Kami juga akan membahas kemungkinan kasus penggunaan untuk kelas ini.

Kita dapat menggunakan DateTimeFormatter untuk memformat tanggal dan waktu secara seragam dalam aplikasi dengan pola yang telah ditentukan atau ditentukan pengguna.

2. DateTimeFormatter dengan Contoh yang Telah Ditetapkan

DateTimeFormatter hadir dengan beberapa format tanggal / waktu standar yang mengikuti standar ISO dan RFC. Misalnya, kita dapat menggunakaninstance ISO_LOCAL_DATE untuk mengurai tanggal seperti '2018-03-09':

DateTimeFormatter.ISO_LOCAL_DATE.format(LocalDate.of(2018, 3, 9));

Untuk mengurai tanggal dengan offset, kita dapat menggunakan ISO_OFFSET_DATE untuk mendapatkan keluaran seperti '2018-03-09-03: 00':

DateTimeFormatter.ISO_OFFSET_DATE.format(LocalDate.of(2018, 3, 9).atStartOfDay(ZoneId.of("UTC-3")));

Sebagian besar contoh kelas DateTimeFormatter yang telah ditentukan sebelumnya difokuskan pada standar ISO-8601. ISO-8601 adalah standar internasional untuk pemformatan tanggal dan waktu.

Namun, ada satu contoh berbeda yang telah ditentukan sebelumnya yang mengurai RFC-1123, Persyaratan untuk Host Internet, yang diterbitkan oleh IETF:

DateTimeFormatter.RFC_1123_DATE_TIME.format(LocalDate.of(2018, 3, 9).atStartOfDay(ZoneId.of("UTC-3")));

Cuplikan ini menghasilkan ' Jum, 9 Mar 2018 00:00:00 -0300 '.

Terkadang kita harus memanipulasi tanggal yang kita terima sebagai String dengan format yang diketahui. Kita bisa menggunakan metode parse () :

LocalDate.from(DateTimeFormatter.ISO_LOCAL_DATE.parse("2018-03-09")).plusDays(3);

Hasil cuplikan kode ini adalah representasi LocalDate untuk 12 Maret 2018.

3. DateTimeFormatter dengan FormatStyle

Terkadang kita mungkin ingin mencetak tanggal dengan cara yang bisa dibaca manusia.

Dalam kasus seperti itu, kita dapat menggunakan nilai java.time.format.FormatStyle enum (FULL, LONG, MEDIUM, SHORT) dengan DateTimeFormatter kita :

LocalDate anotherSummerDay = LocalDate.of(2016, 8, 23); System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).format(anotherSummerDay)); System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).format(anotherSummerDay)); System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(anotherSummerDay)); System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).format(anotherSummerDay));

Keluaran dari gaya pemformatan berbeda pada tanggal yang sama ini adalah:

Tuesday, August 23, 2016 August 23, 2016 Aug 23, 2016 8/23/16

Kami juga dapat menggunakan gaya pemformatan yang telah ditentukan sebelumnya untuk tanggal dan waktu. Untuk menggunakan FormatStyle dengan waktu kita harus menggunakan instance ZonedDateTime , jika tidak, DateTimeException akan dilempar:

LocalDate anotherSummerDay = LocalDate.of(2016, 8, 23); LocalTime anotherTime = LocalTime.of(13, 12, 45); ZonedDateTime zonedDateTime = ZonedDateTime.of(anotherSummerDay, anotherTime, ZoneId.of("Europe/Helsinki")); System.out.println( DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL) .format(zonedDateTime)); System.out.println( DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG) .format(zonedDateTime)); System.out.println( DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM) .format(zonedDateTime)); System.out.println( DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT) .format(zonedDateTime));

Perhatikan bahwa kita telah menggunakan metode ofLocalizedDateTime () dari DateTimeFormatter kali ini.

Dan output yang kami dapatkan adalah:

Tuesday, August 23, 2016 1:12:45 PM EEST August 23, 2016 1:12:45 PM EEST Aug 23, 2016 1:12:45 PM 8/23/16 1:12 PM

Kita juga dapat menggunakan FormatStyle untuk mengurai String waktu tanggal yang mengubahnya menjadi ZonedDateTime , misalnya.

Kami kemudian dapat menggunakan nilai parsing untuk memanipulasi variabel tanggal dan waktu:

ZonedDateTime dateTime = ZonedDateTime.from( DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL) .parse("Tuesday, August 23, 2016 1:12:45 PM EET")); System.out.println(dateTime.plusHours(9));

Output dari cuplikan ini adalah “2016-08-23T22: 12: 45 + 03: 00 [Europe / Bucharest]”, perhatikan bahwa waktu telah berubah menjadi “22:12:45”.

4. DateTimeFormatter dengan Format Kustom

Format dan gaya bawaan dan bawaan dapat mencakup banyak situasi . Namun, terkadang kita perlu memformat tanggal dan waktu dengan agak berbeda. Ini adalah saat pola pemformatan kustom mulai berlaku.

4.1. DateTimeFormatter untuk Date

Misalkan kita ingin menyajikan objek java.time.LocalDate menggunakan format Eropa biasa seperti 31.12.2018. Untuk melakukan ini, kita dapat memanggil metode pabrik DateTimeFormatter . ofPattern ("dd.MM.yyyy").

Ini akan membuat instance DateTimeFormatter yang sesuai yang bisa kita gunakan untuk memformat tanggal kita:

String europeanDatePattern = "dd.MM.yyyy"; DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern(europeanDatePattern); System.out.println(europeanDateFormatter.format(LocalDate.of(2016, 7, 31)));

Output dari cuplikan kode ini adalah "31.07.2016".

Ada banyak pola huruf yang dapat kita gunakan untuk membuat format tanggal yang sesuai dengan kebutuhan kita:

 Symbol Meaning Presentation Examples ------ ------- ------------ ------- u year year 2004; 04 y year-of-era year 2004; 04 M/L month-of-year number/text 7; 07; Jul; July; J d day-of-month number 10

Ini adalah ekstrak dari dokumentasi Java resmi ke kelas DateTimeFormatter .

Jumlah huruf dalam format pola signifikan .

Jika kita menggunakan pola dua huruf untuk bulan tersebut, kita akan mendapatkan representasi bulan dua digit. Jika nomor bulan kurang dari 10, itu akan diisi dengan nol. Jika kita tidak membutuhkan padding dengan angka nol, kita bisa menggunakan pola satu huruf “M”, yang akan menunjukkan Januari sebagai “1”.

Jika kebetulan kita menggunakan pola empat huruf untuk bulan tersebut, "MMMM", maka kita akan mendapatkan representasi "bentuk penuh". Dalam contoh kami, ini adalah "Juli". Pola 5 huruf, "MMMMM", akan membuat formatter menggunakan "bentuk sempit". Dalam kasus kami, "J" akan digunakan.

Selain itu, pola pemformatan kustom juga dapat digunakan untuk mengurai String yang menyimpan tanggal:

DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); System.out.println(LocalDate.from(europeanDateFormatter.parse("15.08.2014")).isLeapYear());

Potongan kode ini memeriksa apakah tanggal " 15.08.2014 " adalah salah satu tahun kabisat, dan ternyata bukan.

4.2. DateTimeFormatter untuk Time

Ada juga huruf pola yang dapat digunakan untuk pola waktu:

 Symbol Meaning Presentation Examples ------ ------- ------------ ------- H hour-of-day (0-23) number 0 m minute-of-hour number 30 s second-of-minute number 55 S fraction-of-second fraction 978 n nano-of-second number 987654321

Cukup mudah menggunakan DateTimeFormatter untuk memformat instance java.time.LocalTime . Misalkan kita ingin menunjukkan waktu (jam, menit dan detik) yang dipisahkan dengan titik dua:

String timeColonPattern = "HH:mm:ss"; DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern(timeColonPattern); LocalTime colonTime = LocalTime.of(17, 35, 50); System.out.println(timeColonFormatter.format(colonTime));

Ini akan menghasilkan keluaran " 17:35:50 ".

Jika kita ingin menambahkan milidetik ke keluaran kita harus menambahkan "SSS" ke pola:

String timeColonPattern = "HH:mm:ss SSS"; DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern(timeColonPattern); LocalTime colonTime = LocalTime.of(17, 35, 50).plus(329, ChronoUnit.MILLIS); System.out.println(timeColonFormatter.format(colonTime));

Yang memberikan output " 17:35:50 329 ".

Perhatikan bahwa "HH" adalah pola jam-hari yang menghasilkan keluaran 0-23. Saat kita ingin menampilkan AM / PM, kita harus menggunakan huruf kecil "hh" untuk jam dan menambahkan pola "a":

String timeColonPattern = "hh:mm:ss a"; DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern(timeColonPattern); LocalTime colonTime = LocalTime.of(17, 35, 50); System.out.println(timeColonFormatter.format(colonTime));

Output yang dihasilkan adalah " 05:35:50 PM ".

We may want to parse time String with our custom formatter and check if it is before noon:

DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("hh:mm:ss a"); System.out.println(LocalTime.from(timeFormatter.parse("12:25:30 AM")).isBefore(LocalTime.NOON));

The output of this last snippet shows that the given time is actually before noon.

4.3. DateTimeFormatter for Time Zones

Often we want to see a time zone of some specific date-time variable. If we happen to use New York-based date-time (UTC -4), we may use “z” pattern-letter for time-zone name:

String newYorkDateTimePattern = "dd.MM.yyyy HH:mm z"; DateTimeFormatter newYorkDateFormatter = DateTimeFormatter.ofPattern(newYorkDateTimePattern); LocalDateTime summerDay = LocalDateTime.of(2016, 7, 31, 14, 15); System.out.println(newYorkDateFormatter.format(ZonedDateTime.of(summerDay, ZoneId.of("UTC-4"))));

This will generate the output “31.07.2016 14:15 UTC-04:00”.

We can parse date time strings with time zones just like we did earlier:

DateTimeFormatter zonedFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm z"); System.out.println(ZonedDateTime.from(zonedFormatter.parse("31.07.2016 14:15 GMT+02:00")).getOffset().getTotalSeconds());

The output of this code is “7200” seconds, or 2 hours, as we'd expect.

Kita harus memastikan bahwa kita memberikan String waktu tanggal yang benar ke metode parse () . Jika kita meneruskan "31.07.2016 14:15", tanpa zona waktu ke zonedFormatter dari potongan kode terakhir, kita akan mendapatkan DateTimeParseException .

5. Kesimpulan

Dalam tutorial ini, kita telah membahas cara menggunakan kelas DateTimeFormatter untuk memformat tanggal dan waktu. Kami telah menggunakan pola contoh kehidupan nyata yang sering muncul saat kami bekerja dengan contoh tanggal-waktu.

Kita dapat mengetahui lebih lanjut tentang Java 8 Date / Time API di tutorial sebelumnya. Seperti biasa, kode sumber yang digunakan dalam tutorial tersedia di GitHub.