Útmutató a SimpleDateFormat használatához

1. Bemutatkozás

Ebben az oktatóanyagban egy alapos túra a SimpleDateFormat osztály.

Megnézzük egyszerű példányosításés formázási stílusok valamint az osztály által bemutatott hasznos módszerek a helyek és időzónák kezelése.

2. Egyszerű azonnali beavatkozás

Először nézzük meg, hogyan lehet egy új példányt példányosítani SimpleDateFormat tárgy.

4 lehetséges kivitelező létezik - de a névnek megfelelően tartsuk egyszerűen a dolgokat. A kezdéshez csak a Húr a kívánt dátumminta ábrázolása.

Kezdjük egy kötőjellel elválasztott dátummintával, így:

"nn-hh-éééé"

Ez helyesen formázza a dátumot, amely a hónap aktuális napjával, az év aktuális hónapjával és végül az aktuális évvel kezdődik. Új formázónkat egyszerű egységvizsgálattal tesztelhetjük. Instantálunk egy újat SimpleDateFormat objektumot, és adja át ismert dátummal:

SimpleDateFormat formatter = új SimpleDateFormat ("éééé-hh-éééé"); assertEquals ("1977-05-24", formatter.format (új dátum (233345223232L)); 

A fenti kódban az formázó ezredmásodperceket konvertál as long ember által olvasható dátumba - 1977. május 24-én.

2.1. Gyári módszerek

Habár SimpleDateFormat egy praktikus osztály a dátumformázó gyors elkészítéséhez, javasoljuk, hogy használja a gyári módszereket a Dátum formátum osztálygetDateFormat (), getDateTimeFormat (), getTimeFormat ().

A fenti példa kicsit másképp néz ki, ha ezeket a gyári módszereket használja:

DateFormat formatter = DateFormat.getDateInstance (DateFormat.SHORT); assertEquals ("5/24/77", formatter.format (új dátum (233345223232L));

Mint fentről megtudhatjuk, a formázási opciók számát a Dátum formátum osztály. Ez nagyrészt korlátozza a rendelkezésre álló formázási lehetőségeket ezért maradunk SimpleDateFormat ebben a cikkben.

2.2. Menetbiztonság

JavaDoc for SimpleDateFormat kifejezetten kimondja:

A dátumformátumok nincsenek szinkronizálva. Minden szálhoz ajánlott külön formátumú példányokat létrehozni. Ha több szál egyidejűleg fér hozzá egy formátumhoz, akkor azt külsőleg kell szinkronizálni.

Így SimpleDateFormat a példányok nem biztonságosak a menetben, és gondosan kell használnunk őket egyidejű környezetben.

A legjobb megoldás a probléma megoldásáraaz a-val kombinációban történő felhasználás ThreadLocal. Így minden szál a sajátjával végződik SimpleDateFormat Például a megosztás hiánya szálbiztonságossá teszi a programot:

privát végleges ThreadLocal formázó = ThreadLocal .withInitial (() -> új SimpleDateFormat ("dd-MM-yyyy"));

Az érv a withItial módszer szállítója SimpleDateFormat példányok. Minden alkalommal, amikor a ThreadLocal létre kell hoznia egy példányt, akkor ezt a szállítót fogja használni.

Ezután a formázót használhatjuk a ThreadLocal példa:

formatter.get (). format (dátum)

A ThreadLocal.get () módszer inicializálja a SimpleDateFormat először az aktuális szálhoz, majd újra felhasználja azt a példányt.

Ezt a technikát hívjuk szálzár mivel az egyes példányok használatát egy adott szálra korlátozzuk.

Két másik megközelítés létezik ugyanazon probléma kezelésére:

  • Használata szinkronizált blokkok vagy ReentrantLocks
  • Létrehozási dobok létrehozása SimpleDateFormat igény szerint

Mindkét megközelítés nem ajánlott: Az előbbi jelentős teljesítménysütést ér el, ha a verseny nagy, az utóbbi pedig sok tárgyat hoz létre, ami nyomást gyakorol a szemétszállításra.

Érdemes ezt megemlíteni, a Java 8 óta egy új DateTimeFormatter osztály került bevezetésre. Az új DateTimeFormatter osztály az változhatatlan és menetbiztos. Ha Java 8-as vagy újabb verzióval dolgozunk, akkor az új használatával DateTimeFormatter osztály ajánlott.

3. A dátumok elemzése

SimpleDateFormat és Dátum formátum nem csak lehetővé teszi számunkra a dátumok formázását - de meg is fordíthatjuk a műveletet. Használni a elemzés módszerrel adja meg a Húr dátum ábrázolása és a Dátum objektum egyenértékű:

SimpleDateFormat formatter = új SimpleDateFormat ("éééé-hh-éééé"); Dátum myDate = új dátum (233276400000L); ParsedDátum = formatter.parse ("1977-05-24"); assertEquals (myDate.getTime (), parsedDate.getTime ());

Fontos itt megjegyezni, hogy a A konstruktorban megadott mintának ugyanabban a formátumban kell lennie, mint az elemzett dátumnak használni a elemzés módszer.

4. Dátum-idő minták

SimpleDateFormat rengeteg különböző lehetőséget kínál a dátum formázásakor. Míg a teljes lista elérhető a JavaDocs-ban, vizsgáljuk meg a leggyakrabban használt opciókat:

LevélDátum komponensPélda
MHónap12; December
yév94
dnap23; Hétf
Hóra03
mperc57

A a dátum komponens által visszaadott kimenet nagymértékben függ a felhasznált karakterek számától is belül Húr. Vegyük például a június hónapot. Ha a dátum karakterláncot a következőképpen definiáljuk:

"MM"

Ekkor eredményünk számkódként jelenik meg - 06. Ha azonban még egy M-et adunk a dátum karakterláncunkhoz:

"MMM"

Ezután az így kapott formázott dátum jelenik meg szóként Június.

5. A területi beállítások alkalmazása

A SimpleDateFormat osztály is sokféle lokált támogat amelyet a konstruktor meghívásakor állítunk be.

Vegyük át ezt a gyakorlatba egy dátum francia nyelvű formázásával. Mi példázzuk a SimpleDateFormat tárgy, miközben ellátja Locale.FRANCIA a kivitelezőnek.

SimpleDateFormat franceDateFormatter = new SimpleDateFormat ("EEEEE dd-MMMMMMM-yyyy", Locale.FRANCE); Dátum myWednesday = új dátum (1539341312904L); assertTrue (franceDateFormatter.format (myWednesday) .startsWith ("vendredi"));

Adott dátum, egy szerda délután megadásával állíthatjuk, hogy a mi franceDateFormatter helyesen formázta a dátumot. Az új dátum helyesen kezdődik Vendredi -Francia szerdára!

Érdemes megjegyezni egy kis gotchát a konstruktor Locale változatában - bár sok lokalizáció támogatott, a teljes lefedettség nem garantált. Az Oracle a gyári módszerek használatát javasolja Dátum formátum osztály a területi lefedettség biztosítása érdekében.

6. Az időzónák megváltoztatása

Mivel SimpleDateFormat kiterjeszti a Dátum formátum osztály, mi is manipulálja az időzónát a setTimeZone módszer. Vizsgáljuk meg ezt működés közben:

Dátum most = új Dátum (); SimpleDateFormat simpleDateFormat = új SimpleDateFormat ("EEEE dd-MMM-yy HH: mm: ssZ"); simpleDateFormat.setTimeZone (TimeZone.getTimeZone ("Európa / London")); logger.info (simpleDateFormat.format (most)); simpleDateFormat.setTimeZone (TimeZone.getTimeZone ("Amerika / New_York")); logger.info (simpleDateFormat.format (most));

A fenti példában ugyanezt szállítjuk Dátum két különböző időzónára ugyanazon SimpleDateFormat tárgy. Hozzáadtuk a „Z” karakter a minta végéig Húr az időzóna-különbségek jelzésére. A kimenet a formátum metódust ezután naplózza a felhasználó számára.

Ütés közben láthatjuk az aktuális időket a két időzónához képest:

INFO: 18-október 12. péntek 12: 46: 14 + 0100 INFO: 18-október 12., péntek 07: 46: 14-0400

7. Összegzés

Ebben az oktatóanyagban mélyen belemerültünk a SimpleDateFormat.

Megnéztük, hogyan kell példányosítani SimpleDateFormat valamint hogy a minta Húr hatással van a dátum formázására.

Játszottunk vele a területi beállítások megváltoztatása a String kimenetét, mielőtt végre kísérletezne időzónák felhasználásával.

Mint mindig, a teljes forráskód megtalálható a GitHubon.