Útmutató a DateTimeFormatterhez

1. Áttekintés

Ebben az oktatóanyagban áttekintjük a Java 8-at DateTimeFormatter osztály és annak formázási mintái. Meg fogjuk vitatni ennek az osztálynak a lehetséges felhasználási eseteit is.

Tudjuk használni DateTimeFormatter a dátumok és időpontok egységes formázása egy alkalmazásban, előre vagy a felhasználó által meghatározott mintákkal.

2. DateTimeFormatter előre definiált példányokkal

DateTimeFormatter több előre meghatározott dátum / idő formátummal érkezik amelyek megfelelnek az ISO és az RFC szabványoknak. Például használhatjuk a ISO_LOCAL_DATE például a „2018-03-09” dátum elemzéséhez:

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

A dátum elemzéséhez eltolással használhatjuk ISO_OFFSET_DATE olyan eredményt kapni, mint a ‘2018-03-09-03: 00’:

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

A. Előre definiált példányainak többsége DateTimeFormatter osztály az ISO-8601 szabványra összpontosít. Az ISO-8601 a dátum és idő formázására vonatkozó nemzetközi szabvány.

Van azonban egy másik, előre definiált példa, amely értelmezi az IETF által közzétett RFC-1123 - követelmény az internetes házigazdák számára:

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

Ez a kódrészlet2018. március 9., péntek, 00:00:00 -0300‘.

Néha manipulálnunk kell azt a dátumot, amelyet a-ként kapunk Húr ismert formátumú. Használhatjuk a elemzés () módszer:

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

Ennek a kódrészletnek az eredménye a LocalDate képviselet 2018. március 12-ig.

3. DateTimeFormatter val vel FormatStyle

Előfordulhat, hogy a dátumokat ember által olvasható módon szeretnénk kinyomtatni.

Ilyen esetekben használhatjuk java.time.format.FormatStyle enum (TELJES, HOSSZ, KÖZEPES, RÖVID) értékeket a mi 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));

A különböző formázási stílusok kimenete ugyanazon a dátumon:

2016. augusztus 23., kedd, 2016. augusztus 23., 2016. augusztus 23., 2016. 08. 23

Előre definiált formázási stílusokat is használhatunk a dátumhoz és az időhöz. Használni FormatStyle idővel használnunk kell ZonedDateTime Például a DateTimeException dobni fogják:

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

Figyeljük meg, hogy használtuk ofLocalizedDateTime () a metódusa DateTimeFormatter ezúttal.

És a kimenetet kapjuk:

2016. augusztus 23., kedd, 13:12:45 EEST 2016. augusztus 23, 13:12:45 EEST 2016. augusztus 23. 13:12:45 16.8.13 13:12

Használhatjuk is FormatStyle hogy elemezzen egy dátumot Húr konvertálása ZonedDateTime, például.

Ezután az elemzett érték segítségével manipulálhatjuk a dátum és idő változót:

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

Ennek a kódrészletnek a kimenete „2016-08-23T22: 12: 45 + 03: 00 [Európa / Bukarest]”, vegye figyelembe, hogy az idő „22:12:45” -re változott.

4. DateTimeFormatter egyedi formátumokkal

Az előre definiált és beépített formázók és stílusok sok helyzetet lefedhetnek. Néha azonban némileg máshogy kell formáznunk a dátumot és az időt. Ekkor jönnek létre az egyedi formázási minták.

4.1. DateTimeFormatter a Dátumra

Tegyük fel, hogy szeretnénk bemutatni a java.time.LocalDate objektumot olyan hagyományos európai formátumban, mint 2018.12.31. Ehhez hívhatnánk a gyári módszert DateTimeFormatter.ofPattern („éééé.HH.Éééé”).

Ez létrehoz egy megfelelőt DateTimeFormatter például, amellyel formázhatjuk a dátumunkat:

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

Ennek a kódrészletnek a kimenete „2016.07.31.” Lesz.

Sokféle mintabetű van, amellyel az igényeinknek megfelelő dátumformátumot készíthetünk:

 Szimbólum Jelentés Példák bemutatásra ------ ------- ------------ ------- u 2004. év; 2004. év 2004. év; 04 M / L az év hónapjának száma / szöveg 7; 07; Július; Július; J d a 10. nap hónapja

Ez a hivatalos Java dokumentáció kivonata a DateTimeFormatter osztály.

A betűk száma a minta formátumban jelentős.

Ha kétbetűs mintát használunk a hónapra, akkor kétjegyű havi ábrázolást kapunk. Ha a hónap száma kevesebb, mint 10, akkor nulla lesz. Ha nincs szükségünk az említett nulla nélküli kitöltésre, használhatunk egybetűs „M” mintát, amely januárban „1” -ként jelenik meg.

Ha véletlenül egy négybetűs mintát használunk a hónapra, „MMMM”, akkor egy „teljes űrlap” ábrázolást kapunk. Példánkban „július”. Ötbetűs „MMMMM” mintával a formázó a „keskeny formát” fogja használni. Esetünkben „J” -t használnánk.

Hasonlóképpen, az egyéni formázási minta felhasználható egy dátumot tartalmazó karakterlánc elemzésére is:

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

Ez a kódrészlet ellenőrzi, hogy a dátum15.08.2014”Szökőév, és nem az.

4.2. DateTimeFormatter időre

Vannak olyan mintabetűk is, amelyek felhasználhatók az időmintákhoz:

 Szimbólum Jelentés Példák bemutatásra ------ ------- ------------ ------- H a nap órája (0-23) 0 m az óra percének száma 30 s a perc másodpercének száma 55 S a másodperc tört frakciója 978 n a másodperc nano száma 987654321

Használata meglehetősen egyszerű DateTimeFormatter formázni a java.time.LocalTime példa. Tegyük fel, hogy kettősponttal határolt időt (órákat, perceket és másodperceket) szeretnénk megjeleníteni:

Karakterlánc időColonPattern = "HH: mm: ss"; DateTimeFormatter timeColonFormatter = DateTimeFormatter.ofPattern (timeColonPattern); LocalTime colonTime = LocalTime.of (17, 35, 50); System.out.println (timeColonFormatter.format (colonTime));

Ez kimenetet generál17:35:50“.

Ha ezredmásodperceket szeretnénk hozzáadni a kimenethez, akkor az SSS-t kell hozzáadni a mintához:

Karakterlánc 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));

Ez adja a kimenetet17:35:50 329“.

Ne feledje, hogy a „HH” egy olyan napi óramintázat, amely 0–23 kimenetet generál. Amikor délutánt / délelőttöt szeretnénk megjeleníteni, órákig kisbetűs „hh” -t kell használnunk, és hozzá kell adnunk egy „a” mintát:

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

A létrehozott kimenet05:35:50 PM“.

Érdemes elemezni az időt Húr egyéni formázónkkal, és ellenőrizze, hogy dél előtt van-e:

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

Ennek az utolsó részletnek a kimenete mutatja, hogy a megadott idő valójában dél előtt van.

4.3. DateTimeFormatter az időzónák számára

Gyakran szeretnénk látni valamilyen meghatározott dátum-idő változó időzónáját. Ha véletlenül New York-i alapú dátum-időt (UTC -4) használunk, akkor az „z” minta-betűt használhatjuk az időzóna nevéhez:

Karakterlánc newYorkDateTimePattern = "nn.HH.Ééééé ÓÓ: pp 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"))));

Ez generálja a „2016.07.31. 14:15 UTC-04: 00” kimenetet.

A dátum és idő karakterláncokat elemezhetjük az időzónákkal, akárcsak korábban:

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

Ennek a kódnak a kimenete „7200” másodperc, vagyis 2 óra, amire számítottunk.

Gondoskodnunk kell arról, hogy pontos dátumot adjunk meg Húr hoz elemzés () módszer. Ha elhaladunk a „2016.07.31 14:15” időzónán kívül a zonedFormatter az utolsó kódrészletből a DateTimeParseException.

5. Következtetés

Ebben az oktatóanyagban megvitattuk a DateTimeFormatter osztály formátum dátumokat és időpontokat. Olyan valós példa mintákat használtunk, amelyek gyakran felmerülnek, amikor dátum-idő példányokkal dolgozunk.

Tudhatunk meg többet a Java 8-ról Dátum idő API a korábbi oktatóanyagokban. Mint mindig, az oktatóanyagban használt forráskód is elérhető a GitHubon.