Ú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él | Dátum komponens | Példa |
---|---|---|
M | Hónap | 12; December |
y | év | 94 |
d | nap | 23; Hétf |
H | óra | 03 |
m | perc | 57 |
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.