Panduan untuk DateTimeFormatter

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan mengkaji kelas Java 8 DateTimeFormatter dan corak pemformatannya . Kami juga akan membincangkan kemungkinan kes penggunaan untuk kelas ini.

Kita boleh menggunakan DateTimeFormatter untuk memformat tarikh dan waktu secara seragam dalam aplikasi dengan corak yang telah ditentukan atau ditentukan oleh pengguna.

2. DateTimeFormatter dengan Contoh yang Ditentukan

DateTimeFormatter dilengkapi dengan pelbagai format tarikh / masa yang telah ditetapkan yang mengikut standard ISO dan RFC. Sebagai contoh, kita boleh menggunakaninstance ISO_LOCAL_DATE untuk menguraikan tarikh seperti '2018-03-09':

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

Untuk menguraikan tarikh dengan ofset, kita dapat menggunakan ISO_OFFSET_DATE untuk mendapatkan output seperti '2018-03-09-03: 00':

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

Sebilangan besar contoh kelas DateTimeFormatter yang telah ditentukan tertumpu pada standard ISO-8601. ISO-8601 adalah standard antarabangsa untuk pemformatan tarikh dan masa.

Namun, ada satu contoh yang berbeza yang menguraikan RFC-1123, Syarat untuk Host Internet, yang diterbitkan oleh IETF:

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

Coretan ini menghasilkan ' Jum, 9 Mac 2018 00:00:00 -0300 '.

Kadang-kadang kita harus memanipulasi tarikh yang kita terima sebagai Rentetan daripada format yang diketahui. Kita boleh menggunakan kaedah parse () :

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

Hasil coretan kod ini adalah perwakilan LocalDate untuk 12 Mac 2018.

3. DateTimeFormatter dengan FormatStyle

Kadang-kadang kita mungkin mahu mencetak tarikh dengan cara yang dapat dibaca oleh manusia.

Dalam kes sedemikian, kita mungkin menggunakan nilai java.time.format.FormatStyle (FULL, LONG, MEDIUM, SHORT) dengan DateTimeFormatter :

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 gaya pemformatan yang berbeza pada tarikh yang sama adalah:

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

Kami juga boleh menggunakan gaya pemformatan yang telah ditentukan untuk tarikh dan masa. Untuk menggunakan FormatStyle dengan masa kita harus menggunakan contoh ZonedDateTime , jika tidak, DateTimeException akan dilemparkan:

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));

Notis yang kami telah menggunakan ofLocalizedDateTime () kaedah DateTimeFormatter masa ini.

Dan output yang kami dapat ialah:

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 boleh menggunakan FormatStyle untuk menguraikan waktu tarikh String menukarnya menjadi ZonedDateTime , misalnya.

Kita kemudian boleh menggunakan nilai yang dihuraikan untuk memanipulasi pemboleh ubah tarikh 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 coretan ini adalah "2016-08-23T22: 12: 45 + 03: 00 [Eropah / Bucharest]", perhatikan bahawa waktunya telah berubah menjadi "22:12:45".

4. DateTimeFormatter dengan Format Tersuai

Pembentuk dan gaya yang telah ditetapkan dan terbina dalam dapat merangkumi banyak keadaan . Namun, kadang-kadang kita perlu memformat tarikh dan masa dengan cara yang agak berbeza. Ini adalah ketika corak pemformatan khas dimainkan.

4.1. DateTimeFormatter untuk Tarikh

Andaikan kita ingin membentangkan objek java.time.LocalDate menggunakan format Eropah biasa seperti 31.12.2018. Untuk melakukan ini, kita boleh memanggil kaedah kilang DateTimeFormatter . ofPattern ("dd.MM.yyyy").

Ini akan membuat contoh DateTimeFormatter yang sesuai yang dapat kita gunakan untuk memformat tarikh kita:

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

Keluaran coretan kod ini adalah "31.07.2016".

Terdapat banyak huruf corak yang boleh kita gunakan untuk membuat format tarikh yang sesuai dengan keperluan 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 petikan dokumentasi Java rasmi ke kelas DateTimeFormatter .

Bilangan huruf dalam format corak adalah signifikan .

Sekiranya kita menggunakan corak dua huruf untuk bulan itu, kita akan mendapat representasi dua digit bulan. Sekiranya bilangan bulan kurang dari 10, angka itu akan menjadi sifar. Bila kita tidak memerlukan padding yang disebutkan dengan nol, kita dapat menggunakan pola satu huruf "M", yang akan menunjukkan Januari sebagai "1".

Sekiranya kita menggunakan pola empat huruf untuk bulan itu, "MMMM", maka kita akan mendapatkan representasi "bentuk penuh". Dalam contoh kita, ini adalah "Julai". Corak 5 huruf, "MMMMM", akan menjadikan pemformat menggunakan "bentuk sempit". Dalam kes kami, "J" akan digunakan.

Begitu juga, corak pemformatan khusus juga dapat digunakan untuk menguraikan String yang mempunyai tarikh:

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

Coretan kod ini memeriksa sama ada tarikh " 15.08.2014 " adalah salah satu tahun lompat, dan tidak.

4.2. DateTimeFormatter untuk Masa

Terdapat 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 contoh java.time.LocalTime . Andaikan kita mahu menunjukkan waktu (jam, minit dan saat) yang dibatasi 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 output " 17:35:50 ".

Sekiranya kita ingin menambahkan milisaat ke output, kita harus menambahkan "SSS" ke corak:

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 bahawa "HH" adalah corak jam sehari yang menghasilkan output 0-23. Apabila kita ingin menunjukkan AM / PM, kita harus menggunakan huruf kecil "hh" berjam-jam dan menambahkan corak "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 bahawa kita memberikan waktu tarikh yang betul String to the parse () kaedah. Sekiranya kita melewati "31.07.2016 14:15", tanpa zon waktu ke zonedFormatter dari coretan kod terakhir, kita akan mendapat DateTimeParseException .

5. Kesimpulan

Dalam tutorial ini, kami telah membincangkan cara menggunakan kelas DateTimeFormatter untuk format tarikh dan masa. Kami telah menggunakan corak contoh kehidupan nyata yang sering timbul ketika kita bekerja dengan contoh tarikh-tarikh.

Kami dapat mengetahui lebih lanjut mengenai Java 8 Date / Time API dalam tutorial sebelumnya. Seperti biasa, kod sumber yang digunakan dalam tutorial tersedia di GitHub.