Vodič za DateTimeFormatter

1. Pregled

U ovom uputstvu pregledat ćemo Java 8 DateTimeFormatter klase i njezini obrasci oblikovanja. Također ćemo razgovarati o mogućim slučajevima korištenja ove klase.

Možemo koristiti DateTimeFormatter za jednoliko oblikovanje datuma i vremena u aplikaciji s unaprijed definiranim ili korisnički definiranim uzorcima.

2. DateTimeFormatter s unaprijed definiranim primjercima

DateTimeFormatter dolazi s više unaprijed definiranih formata datuma / vremena koji slijede ISO i RFC standarde. Na primjer, možemo koristiti ISO_LOCAL_DATE instance za raščlanjivanje datuma kao što je ‘2018-03-09’:

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

Za raščlanjivanje datuma s pomakom možemo koristiti ISO_OFFSET_DATE da biste dobili izlaz poput "2018-03-09-03: 00":

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

Većina unaprijed definiranih primjera DateTimeFormatter razreda usmjereni su na standard ISO-8601. ISO-8601 je međunarodni standard za oblikovanje datuma i vremena.

Međutim, postoji jedna različita unaprijed definirana instanca koja raščlanjuje RFC-1123, Zahtjev za internetskim domaćinima, objavio IETF:

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

Ovaj isječak generira "Pet, 9. ožujka 2018. 00:00:00 -0300‘.

Ponekad moramo manipulirati datumom koji dobivamo kao Niz poznatog formata. Možemo se poslužiti raščlaniti () metoda:

LocalDate.from (DateTimeFormatter.ISO_LOCAL_DATE.parse ("09.03.2018.")). PlusDays (3);

Rezultat ovog isječka koda je LocalDate zastupanje za 12. ožujka 2018.

3. DateTimeFormatter s FormatStyle

Ponekad bismo možda htjeli ispisati datume na ljudski čitljiv način.

U takvim slučajevima možemo koristiti java.time.format.FormatStyle enum (FULL, LONG, SREDNJI, KRATKI) vrijednosti s našim 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));

Rezultati ovih različitih stilova oblikovanja istog datuma su:

Utorak, 23. kolovoza 2016. 23. kolovoza 2016. 23. kolovoza 2016. 23.8.2016

Također možemo koristiti unaprijed definirane stilove oblikovanja za datum i vrijeme. Koristiti FormatStyle s vremenom ćemo se morati koristiti ZonedDateTime instanca, inače, a DateTimeException bit će bačen:

LocalDate anotherSummerDay = LocalDate.of (2016, 8, 23); LocalTime anotherTime = LocalTime.of (13, 12, 45); ZonedDateTime zonedDateTime = ZonedDateTime.of (anotherSummerDay, anotherTime, ZoneId.of ("Europa / 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));

Primijetite da smo koristili ofLocalizedDateTime () metoda DateTimeFormatter ovaj put.

I izlaz koji smo dobili je:

Utorak, 23. kolovoza 2016. 13:12:45 EEST 23. kolovoza 2016. 13:12:45 EEST 23. kolovoza 2016. 13:12:45 23.8.2016. 13:12

Možemo i koristiti FormatStyle za raščlanjivanje datuma Niz pretvarajući ga u ZonedDateTime, na primjer.

Tada raščlanjenu vrijednost možemo koristiti za manipulaciju varijablom datuma i vremena:

ZonedDateTime dateTime = ZonedDateTime.from (DateTimeFormatter.ofLocalizedDateTime (FormatStyle.FULL) .parse ("utorak, 23. kolovoza 2016. 13:12:45 EET")); System.out.println (dateTime.plusHours (9));

Rezultat ovog isječka je "2016-08-23T22: 12: 45 + 03: 00 [Europa / Bukurešt]", imajte na umu da se vrijeme promijenilo u "22:12:45".

4. DateTimeFormatter s prilagođenim formatima

Unaprijed definirani i ugrađeni formativači i stilovi mogu pokriti puno situacija. Međutim, ponekad moramo nešto drugačije oblikovati datum i vrijeme. Tada nastupaju prilagođeni obrasci formatiranja.

4.1. DateTimeFormatter za Datum

Pretpostavimo da želimo predstaviti a java.time.LocalDate objekt koristeći uobičajeni europski format poput 31.12.2018. Da bismo to učinili, mogli bismo nazvati tvorničku metodu DateTimeFormatter.ofPattern („dd.MM.gggg“).

To će stvoriti odgovarajuće DateTimeFormatter instancu koju možemo koristiti za formatiranje datuma:

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

Rezultat ovog isječka koda bit će "31.07.2016".

Postoji mnogo različitih slova s ​​uzorcima koje možemo koristiti za stvaranje formata za datume koji će odgovarati našim potrebama:

 Simboli Značenje Primjeri prezentacije ------ ------- ------------ ------- godina 2004; 04. godina 2004. godine; 04 M / L broj mjeseca u godini / tekst 7; 07; Srpnja; Srpanj; J d dan u mjesecu broj 10

Ovo je izvadak službene Java dokumentacije za DateTimeFormatter razred.

Broj slova u formatu uzorka je značajan.

Ako za mjesec koristimo dvoslovni obrazac, dobit ćemo dvoznamenkasti prikaz mjeseca. Ako je broj mjeseca manji od 10, bit će nadopunjen nulom. Kada nam ne trebaju spomenuta popunjavanja nulama, možemo upotrijebiti jednoslovni uzorak "M", koji će siječanj prikazati kao "1".

Ako slučajno koristimo obrazac od četiri slova za mjesec, „MMMM“, tada ćemo dobiti prikaz u punoj formi. U našem primjeru to je "srpanj". Uzorak od 5 slova, "MMMMM", natjerat će formatiranje da koristi "uski obrazac". U našem slučaju koristilo bi se "J".

Isto tako, prilagođeni obrazac oblikovanja također se može koristiti za raščlanjivanje niza koji sadrži datum:

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

Ovaj isječak koda provjerava je li datum “15.08.2014”Jedna je od prijestupnih godina, a nije.

4.2. DateTimeFormatter za vrijeme

Postoje i slova uzoraka koja se mogu koristiti za vremenske obrasce:

 Simbol Značenje Primjeri prezentacije ------ ------- ------------ ------- H sat u danu (0-23) broj 0 m broj minuta sata 30 s sekunda broj 55 S frakcija frakcije sekunde 978 n nano-sekunde broj 987654321

Jednostavno je za upotrebu DateTimeFormatter formatirati a java.time.LocalTime primjer. Pretpostavimo da želimo prikazati vrijeme (sate, minute i sekunde) ograničeno dvotočkom:

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

Ovo će generirati izlaz "17:35:50“.

Ako želimo dodati milisekunde na izlaz, trebali bismo dodati "SSS" na obrazac:

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

Što daje izlaz “17:35:50 329“.

Imajte na umu da je "HH" obrazac po satu koji generira 0-23. Kada želimo prikazati AM / PM, trebali bismo satima upotrebljavati mala slova "hh" i dodati obrazac "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));

Generirani izlaz je "17:35:50“.

Možda ćemo htjeti raščlaniti vrijeme Niz pomoću našeg prilagođenog formativača i provjerite je li prije podne:

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

Izlaz ovog posljednjeg isječka pokazuje da je dano vrijeme zapravo prije podneva.

4.3. DateTimeFormatter za vremenske zone

Često želimo vidjeti vremensku zonu neke određene varijable datum-vrijeme. Ako slučajno koristimo datum-vrijeme sa sjedištem u New Yorku (UTC -4), za naziv vremenske zone možemo koristiti slovo uzorka "z":

Niz newYorkDateTimePattern = "dd.MM.gggg 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"))));

To će generirati izlaz "31.07.2016. 14:15 UTC-04: 00".

Vremenske nizove datuma možemo raščlaniti s vremenskim zonama baš kao i ranije:

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

Izlaz ovog koda je “7200” sekundi ili 2 sata, kako bismo očekivali.

Moramo biti sigurni da smo naveli točno vrijeme Niz prema raščlaniti () metoda. Ako prođemo “31.07.2016 14:15”, bez vremenske zone do zonedFormatter iz zadnjeg isječka koda dobit ćemo DateTimeParseException.

5. Zaključak

U ovom uputstvu raspravljali smo o tome kako koristiti DateTimeFormatter razred za format datuma i vremena. Koristili smo primjere u stvarnom životu koji se često javljaju kada radimo s instancama datuma i vremena.

Možemo saznati više o Javi 8 Datum vrijeme API u prethodnim vodičima. Kao i uvijek, izvorni kod korišten u vodiču dostupan je na GitHub-u.