Ú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.