Sprievodca po DateTimeFormatter

1. Prehľad

V tomto výučbe sa pozrieme na Java 8 DateTimeFormatter trieda a jej vzory formátovania. Budeme tiež diskutovať o možných prípadoch použitia pre túto triedu.

Môžeme použiť DateTimeFormatter na jednotné formátovanie dátumov a časov v aplikácii s preddefinovanými alebo používateľom definovanými vzormi.

2. DateTimeFormatter s preddefinovanými inštanciami

DateTimeFormatter prichádza s niekoľkými preddefinovanými formátmi dátumu a času ktoré zodpovedajú štandardom ISO a RFC. Napríklad môžeme použiť ISO_LOCAL_DATE napríklad na analýzu dátumu ako napríklad „2018-03-09“:

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

Na analýzu dátumu s posunom môžeme použiť ISO_OFFSET_DATE získať výstup ako ‘2018-03-09-03: 00‘:

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

Väčšina z preddefinovaných prípadov DateTimeFormatter triedy sú zamerané na normu ISO-8601. ISO-8601 je medzinárodný štandard pre formátovanie dátumu a času.

Existuje však jedna iná preddefinovaná inštancia, ktorá analyzuje RFC-1123, Požiadavka na internetových hostiteľov, publikovanú IETF:

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

Tento úryvok generuje „Pi, 9. marca 2018 00:00:00 -0300‘.

Niekedy musíme manipulovať s dátumom, ktorý dostaneme ako String známeho formátu. Môžeme využiť analyzovať () metóda:

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

Výsledkom tohto útržku kódu je LocalDate zastúpenie na 12. marca 2018.

3. DateTimeFormatter s FormatStyle

Niekedy môžeme chcieť vytlačiť dáta ľudsky čitateľným spôsobom.

V takýchto prípadoch môžeme použiť java.time.format.FormatStyle enum (FULL, LONG, MEDIUM, SHORT) hodnoty s našimi 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));

Výstupom z týchto rôznych štýlov formátovania s rovnakým dátumom sú:

Utorok 23. augusta 2016 23. augusta 2016 23. augusta 2016 23. 8. 2016

Môžeme tiež použiť preddefinované štýly formátovania pre dátum a čas. Použit FormatStyle časom budeme musieť použiť ZonedDateTime inštancia, inak, a DateTimeException bude vyhodené:

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

Všimnite si, že sme použili ofLocalizedDateTime () metóda DateTimeFormatter tentokrát.

A výstup, ktorý dostaneme, je:

Utorok 23. augusta 2016 13:12:45 EEST 23. augusta 2016 13:12:45 EEST 23. augusta 2016 13:12:45 23. 8. 2016 13:12

Môžeme tiež použiť FormatStyle analyzovať dátum a čas String premenou na ZonedDateTime, napríklad.

Potom môžeme pomocou analyzovanej hodnoty manipulovať s premennou dátumu a času:

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

Výstup tohto úryvku je „2016-08-23T22: 12: 45 + 03: 00 [Európa / Bukurešť]“, všimnite si, že čas sa zmenil na „22:12:45“.

4. DateTimeFormatter s vlastnými formátmi

Preddefinované a vstavané formátovače a štýly dokážu pokryť množstvo situácií. Niekedy však musíme formátovať dátum a čas trochu inak. To je prípad, keď sa uplatnia vzory vlastného formátovania.

4.1. DateTimeFormatter pre dátum

Predpokladajme, že chceme predstaviť a java.time.LocalDate objekt pomocou bežného európskeho formátu, ako je 31.12.2018. Mohli by sme to nazvať továrenskou metódou DateTimeFormatter.ofPattern („dd.MM.rrrr“).

Týmto sa vytvorí vhodný údaj DateTimeFormatter inštanciu, ktorú môžeme použiť na formátovanie nášho dátumu:

Reťazec europeanDatePattern = "dd.MM.rrrr"; DateTimeFormatter europeanDateFormatter = DateTimeFormatter.ofPattern (europeanDatePattern); System.out.println (europeanDateFormatter.format (LocalDate.of (2016, 7, 31)));

Výstupom tohto útržku kódu bude „31.07.2016“.

Existuje mnoho rôznych vzorových písmen, ktoré môžeme použiť na vytvorenie formátu dátumov, ktorý bude vyhovovať našim potrebám:

 Symbol Význam Príklady prezentácie ------ ------- ------------ ------- u rok rok 2004; 04-ročný rok 2004; 04 M / L počet mesiacov v mesiaci / text 7; 07; Júl; Júl; J d deň v mesiaci číslo 10

Toto je výpis z oficiálnej dokumentácie Java do DateTimeFormatter trieda.

Počet písmen vo formáte vzoru je značný.

Ak pre mesiac použijeme dvojpísmenový vzor, ​​dostaneme dvojciferné mesačné zastúpenie. Ak je číslo mesiaca menšie ako 10, bude doplnené nulou. Pokiaľ nepotrebujeme spomínanú výplň s nulami, môžeme použiť jednopísmenový vzor „M“, ktorý ukáže január ako „1“.

Ak náhodou použijeme pre mesiac štvorpísmenový vzor „MMMM“, dostaneme vyjadrenie „v úplnom formáte“. V našom príklade je to „júl“. 5-písmenový vzor „MMMMM“ spôsobí, že formátovač použije „úzky tvar“. V našom prípade by sa použilo „J“.

Rovnako je možné použiť vlastný vzor formátovania na analýzu reťazca, ktorý obsahuje dátum:

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

Tento útržok kódu kontroluje, či je dátum „15.08.2014”Je jedným z priestupných rokov a nie je to tak.

4.2. DateTimeFormatter na čas

Existujú aj vzorové písmená, ktoré je možné použiť pre časové vzory:

 Symbol Význam Príklady prezentácie ------ ------- ------------ ------- H hodina dňa (0-23) číslo 0 m minútové číslo 30 s sekundové číslo 55 S zlomok druhej sekundy 978 n nanosekundové číslo 987654321

Je to celkom jednoduché DateTimeFormatter formátovať a java.time.LocalTime inštancia. Predpokladajme, že chceme zobraziť čas (hodiny, minúty a sekundy) ohraničený dvojbodkou:

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

Toto vygeneruje výstup “17:35:50“.

Ak by sme chceli k výstupu pridať milisekundy, mali by sme do vzoru pridať „SSS“:

Reťazec 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));

Čo dáva výstup “17:35:50 329“.

Upozorňujeme, že „HH“ je vzor hodiny dňa, ktorý generuje výstup 0-23. Ak chceme zobrazovať AM / PM, mali by sme hodiny používať malé písmená „hh“ a pridať vzor „a“:

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

Generovaný výstup je „17:35:50 hod“.

Možno budeme chcieť analyzovať čas String pomocou nášho vlastného formátovača a skontrolujte, či je pred poludním:

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

Výstup tohto posledného úryvku ukazuje, že daný čas je skutočne pred poludním.

4.3. DateTimeFormatter pre časové pásma

Často chceme vidieť časové pásmo nejakej konkrétnej premennej dátumu a času. Ak náhodou použijeme dátum a čas v New Yorku (UTC -4), môžeme pre názov časovej zóny použiť vzorové písmeno „z“:

Reťazec newYorkDateTimePattern = "dd.MM.rrrr 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"))));

Týmto sa vygeneruje výstup „31.07.2016 14:15 UTC-04: 00“.

Reťazce dátumu a času môžeme analyzovať s časovými pásmami rovnako ako predtým:

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

Výstup tohto kódu je „7200“ sekúnd alebo 2 hodiny, ako by sme očakávali.

Musíme sa uistiť, že poskytujeme správny dátum a čas String do analyzovať () metóda. Ak minieme „31.07.2016 14:15“, bez časového pásma do zonedFormatter z posledného úryvku kódu dostaneme DateTimeParseException.

5. Záver

V tomto výučbe sme si povedali, ako používať DateTimeFormatter triedy pre formátovanie dátumov a časov. Použili sme príklady vzorov z reálneho života, ktoré často vznikajú pri práci s inštanciami dátumu a času.

O Java 8 sa môžeme dozvedieť viac Dátum Čas API v predchádzajúcich tutoriáloch. Ako vždy, zdrojový kód použitý v tomto výučbe je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found