DateFormatter — egy Foundation osztály, amely a Date objektumok és azok szöveges ábrázolása közötti kétirányú konverzióra szolgál. Az osztály figyelembe veszi a felhasználó területi beállításait, időzónáját és naptárát, biztosítva a dátumok helyes megjelenítését a világ bármely régiójában. Az Apple Developer Documentation (2025) szerint a DateFormatter négy előre definiált dátum és idő stílust, valamint teljesen egyedi formátumokat is támogat a mintakarakterlánc segítségével. DateFormatter nélkül nem lehet helyesen megjeleníteni a dátumot a felhasználó számára egy nemzetközivé tett alkalmazásban.
Főbb pontok
DateFormatter — egy osztály a Foundation keretrendszerből, amely kétirányú konverziót valósít meg a Date és a karakterlánc között. Az OpenStep-ben jelent meg NSDateFormatterként, és azóta is az Apple platformok fő dátumformázó eszköze maradt. Az osztály a Formatter-ből öröklődik és kényelmes API-t biztosít a lokalizált dátummegjelenítéshez.
A DateFormatter működési elve a Unicode LDML mintákon alapul — ugyanazokon, amelyeket az ICU (International Components for Unicode) használ. A mintát a dateFormat tulajdonság határozza meg, ahol az y, M, d, H, m, s szimbólumok rendre az évet, hónapot, napot, órákat, perceket és másodperceket jelölik. A szimbólum ismétlése határozza meg a formátumot: „y“ — kétjegyű év, „yyyy“ — négyjegyű.
A DateFormatter létrehozása költséges művelet, mivel az inicializálás során betöltődnek a területi beállítások és a naptár adatai. Az Apple azt javasolja, hogy a formázót egyszer hozza létre minden formázási típushoz, és használja at ismét. A SwiftUI-ban és az UIKit-ben a formázók gyakran statikus tulajdonságokban vannak gyorsítótárban, vagy lustán jönnek létre az első hozzáféréskor.
DateFormatter számos iOS rendszerkomponensben használatos. Az UIDatePicker belsőleg DateFormatter-t használ a dátumok megjelenítéséhez countDownTimer módban. A bemeneten formázóval rendelkező TextField automatikusan érvényesíteni tudja a felhasználó által megadott dátumot. A Core Data támogatja a Date típusú attribútumokat, de azok szöveges megjelenítése mindig a DateFormatter-en keresztül történik.
Thread Safety — a DateFormatter nem szál-biztos. A formázó tulajdonságainak módosítása különböző szálakból meghatározatlan viselkedéshez vezet. Többszálas használathoz hozzon létre külön formázó példányokat minden szálhoz, vagy használjon szinkronizációt NSLock vagy serial queue segítségével.
dateStyle és timeStyle — a dátum megjelenítésének legegyszerűbb beállítási módjai. Minden stílusnak négy változata van: .short, .medium, .long, .full. A dateStyle és timeStyle kombinációja lehetővé teszi a dátum és idő formátumának független beállítását, a .none tulajdonság pedig kikapcsolja a megfelelő részt.
Az amerikai területi beállításoknál a .short stílus „7/21/26“ formában, a magyar beállításoknál pedig „2026. 07. 21.“ formában formázza a dátumot. A .long stílus a magyar területi beállításoknál „2026. július 21.“, a .full pedig „kedd, 2026. július 21.“ formát jeleníti meg a hét napjával. Mind a négy stílus automatikusan alkalmazkodik a regionális szabványokhoz, beleértve az összetevők sorrendjét és az elválasztójeleket.
RelativeDateFormatter az iOS 15+-ban alternatív megközelítést kínál a RelativeDateFormatter és DateIntervalFormatter segítségével. A RelativeDateFormatter az aktuális kontextushoz „ma“, „tegnap“, „3 nap múlva“ üzeneteket jelenít meg. A DateIntervalFormatter dátumtartományokat mutat: “2026. július 21–25.” — foglalásokhoz és tervezéshez.
| Stílus | Példa (hu_HU) | Példa (en_US) |
|---|---|---|
| .short | 2026. 07. 21. | 7/21/26 |
| .medium | 2026. júl. 21. | Jul 21, 2026 |
| .long | 2026. július 21. | July 21, 2026 |
| .full | kedd, 2026. július 21. | Tuesday, July 21, 2026 |
A stílusok kombinálásakor a DateFormatter automatikusan kiválasztja az elválasztójelet: .short.date + .short.time esetén az eredmény „2026. 07. 21., 14:30“ lehet. .full.date + .full.time esetén — „kedd, 2026. július 21., 14:30:00 MSK“. Az elválasztójelet a területi beállítások irányítják, nem a fejlesztő — ez garantálja a felhasználó regionális elvárásainak való megfelelt.
dateFormat lehetővé teszi tetszőleges formázási minta meghatározását a Unicode LDML specifikáció szimbólumainak használatával. Ez teljes kontrollt ad a megjelenítés felett: megjelenítheti csak az évet és hónapot, a hét napját szám nélkül, vagy az időt másodpercek nélkül. Az egyedi formátum nélkülözhetetlen a speciális tervezési követelményekhez.
Alapvető szimbólumok — yyyy (év: 2026), MM (hónap: 07), dd (nap: 21), HH (óra: 14), mm (perc: 30), ss (másodperc: 00). A teljes hónapnévhez használja az MMMM (július), a rövidítetthez az MMM (júl.) értéket. A hét napja — EEEE (kedd), rövidítve — E (k).
A dateFormat használatakor fontos beállítani a formázó locale értékét. Ha a locale nincs beállítva, a formázó a rendszer területi beállításait használja, ami nem kívánatos lehet egy rögzített API formátumhoz. Az Apple a locale = Locale(identifier: “en_US_POSIX”) beállítását javasolja a rögzített régióközi formátumhoz, különösen a szerverválaszokból történő dátumelemzésnél.
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "ru_RU")
formatter.dateFormat = "d MMMM yyyy"
let customString = formatter.string(from: Date())
// "21 July 2026"
// Egyedi sztring elemzése
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let date = formatter.date(from: "2026-07-21 14:30:00")!
A dateFormat hiba — az alkalmazássszakadások egyik gyakori oka. Ha a formátum nem egyezik a karakterlánccal, a date(from:) módszer nil értéket ad vissza. Használjon guard let vagy ?? utasítást az opcionális érték biztonságos kinyeréséhez. A formátum ellenőrzéséhez tesztelje az összes támogatott nyelven — egyes LDML szimbólumok eltérően működnek a különböző területi beállításokban.
Locale határozza meg, hogyan jelenjenek meg a hónapok és a hét napjainak nevei, és milyen elválasztójelek használatosak. A DateFormatter alapértelmezés szerint a Locale.current értéket használja, de bizonyos esetekben konkrét területi beállítások megadása szükséges: rögzített naplóformátumhoz használja az en_US_POSIX értéket, szerver dátumokhoz — a szerverrel megegyező területi beállításokat.
A TimeZone tulajdonság határozza meg a megjelenítés időzónáját. Alapértelmezés szerint a rendszer időzónája használatos, de nemzetközi közönséggel rendelkező alkalmazásoknál gyakran szükséges a dátumok megjelenítése a felhasználó időzónájában vagy UTC-ben. A timeZone módosítása csak a megjelenítést befolyásolja — a Date értéke változatlan marad.
Fontos jellemző: ha a DateFormatter karakterlánc elemzésére szolgál, és a karakterlánc időzóna jelzést tartalmaz (például “2026-07-21T14:30:00Z” Z-vel az UTC-hez), a timeZone tulajdonság figyelmen kívül marad — a formázó a karakterláncban szereplő időzónát használja. Ha az időzóna hiányzik a karakterláncból, a formázó timeZone értéke érvényesül.
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "ru_RU")
formatter.timeZone = TimeZone(identifier: "Europe/Moscow")
formatter.dateStyle = .long
formatter.timeStyle = .short
let moscowTime = formatter.string(from: Date())
// "21 July 2026, 14:30"
// Elemzés időzóna nélkül a sztringben
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.dateFormat = "yyyy-MM-dd HH:mm"
let utcDate = formatter.date(from: "2026-07-21 10:30")!
AutoupdatingCurrentLocale — egy speciális területi beállítás típus, amely automatikusan frissül, amikor a felhasználó rendszerbeállításai változnak. A DateFormatter alapértelmezés szerint támogatja. Ha az alkalmazás a háttérben fut és a felhasználó megváltoztatja a rendszer nyelvét, a változtatás előtt létrehozott formázó továbbra is a régi területi beállításokat használja — a frissítéshez ajat példányt kell létrehozni.
ISO8601DateFormatter — egy specializált formázó az ISO 8601 formátumú dátumokkal való munkához. Ez a formátum a de facto szabvány a REST API, JSON és adatcsere számára. Az ISO8601DateFormatter lényegesen gyorsabban működik, mint a DateFormatter, mivel nem függ a területi beállításoktól és rögzített elemzési nyelvtant használ.
A formázó fő opciói — .withInternetDateTime (2026-07-21T14:30:00Z), .withFractionalSeconds (ezredmásodperceket ad hozzá), .withTimeZone (tartalmazza az időzóna eltolást). Az opciók kombinálásával bármely ISO 8601 változat előállítható: ezredmásodpercekkel, időzónával, idő nélküli dátummal.
JSONEncoder.DateEncodingStrategy lehetővé teszi a dátumkódolás globális konfigurálását az összes Codable modell számára. Változatok — .iso8601 (ISO8601DateFormatter-t használ), .formatted(DateFormatter), .millisecondsSince1970, .secondsSince1970. A stratégia választása kihat a szérializáció teljes életciklusára, és egységesnek kell lennie az összes API végpont számára.
// ISO8601DateFormatter
let isoFormatter = ISO8601DateFormatter()
isoFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds]
let isoString = isoFormatter.string(from: Date())
// "2026-07-21T14:30:00.000Z"
// JSONEncoder ISO8601-gyel
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601
// Alternatíva: JSONEncoder egyedi formázóval
let customEncoder = JSONEncoder()
customEncoder.dateEncodingStrategy = .formatted(myFormatter)
DateFormatter vs ISO8601DateFormatter — válassza az ISO8601DateFormatter-t a dátumok API-ban történő szérializálásához és elemzéséhez, mivel 5-10-szer gyorsabban működik, mint a DateFormatter, és nem érzékeny a lokalizációs hibákra. A DateFormatter-t hagyja meg a felhasználói felület számára, ahol a hónapok és hét napjainak neveivel ellátott lokalizált megjelenítés szükséges a felhasználó anyanyelvén.
Tekintsük át a DateFormatter használatának valós forgatókönyveit egy iOS alkalmazásban: dátum megjelenítése hírlistában, születési dátum bevitele és jelentés exportálása dátumokkal különböző időzónákban.
RelativeDateFormatter optimális hírcsatornákhoz. „Az imént“, „5 perccel ezelőtt“, „tegnap“ üzeneteket jelenít meg friss hírekhez, és átvált a teljes dátumra a régebbieknél. A váltási küszöböt a calendar segítségével lehet konfigurálni: hírekhez használjon 24 órás, üzenetküldőkhöz egyhetes küszöböt.
func formatRelativeDate(_ date: Date) -> String {
let relative = RelativeDateFormatter()
relative.unitsStyle = .full
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
let daysDiff = Calendar.current.dateComponents(
[.day], from: date, to: Date()
).day ?? 0
return daysDiff < 1
? relative.localizedString(for: date, relativeTo: Date())
: formatter.string(from: date)
}
Születési dátum bevitele — egy másik gyakori forgatókönyv. A DateFormatter konkrét dateFormat „yyyy. MM. dd.“ és „hu_HU“ területi beállításokkal van konfigurálva. A bevitt karakterlánc elemzésekor fontos a lehetséges hibák kezelése: a formázó nil értéket ad vissza érvénytelen karakterlánc esetén. Sikeres elemzés után a dátum ellenőrződik, hogy a megengedett tartományba esik-e — nem korábban, mint 1900, és nem később, mint ma.
Jelentés exportálása dátumokkal rögzített formátumot igényel, amely független a felhasználó területi beállításaitól. Használja a dateFormat „yyyy-MM-dd HH:mm:ss“ értéket en_US_POSIX területi beállításokkal és UTC időzónával. Ez a megközelítés garantálja, hogy a fájl bármely országban helyesen megnyílik, függetlenül a rendszer regionális beállításaitól.
| Forgatókönyv | Formázó | Kulcs beállítás |
|---|---|---|
| Hírcsatorna | RelativeDateFormatter | unitsStyle = .full |
| Dátum bevitele | DateFormatter | dateFormat + fallback |
| API szérializáció | ISO8601DateFormatter | withInternetDateTime |
| Jelentés export | DateFormatter | en_US_POSIX + UTC |
Gyakran Ismételt Kérdések
A leggyakoribb ok — a dateFormat és a karakterlánc formátumának össze nem illése. Például a „yyyy. MM. dd.“ formátum nem elemzi a „2026-07-21“ karakterláncot. A második ok — a területi beállítások össze nem illése: a „July 21, 2026“ karakterlánc nem elemezhető a hu_HU területi beállításokkal. Harmadik — elgépelések az LDML szimbólumokban: használja a yyyy értéket, ne az YYYY-t (eltérő jelentés).
Nem. A DateFormatter egy nehéz objektum, inicializálása magában foglalja a területi adatok betöltését. Hozzon létre egy példányt formázási típusonként, és használja at ismét. Többszálas környezetben használjon Thread-local storage-t vagy formázók gyűjtőjét serial queue-val a szinkronizáláshoz.
DateFormatter abszolút dátumot (2026. július 21.) jelenít meg, míg a RelativeDateFormatter relatív dátumot (ma, tegnap, 3 nap múlva). A RelativeDateFormatter az iOS 15+-ban jelent meg, és ugyanazt az LDML mintát használja, de automatikusan kiválasztja a relatív megjelenítést.
Állítsa a formázó timeZone értékét UTC-re az elemzés előtt. Ha a szerver helyi időben adja vissza a dátumot időzóna jelzés nélkül, ellenőrizze az API specifikációt — nagy valószínűséggel UTC az elvárt. A végén Z-vel rendelkező ISO 8601 esetén nincs szükség timeZone-ra — a formázó az eltolást a karakterláncból elemzi.
Ne használjon egy példányt különböző szálakból szinkronizálás nélkül. Hozzon létre ajat példányt minden szálban, vagy használja a Thread.current.threadDictionary tulajdonságot tároláshoz. Alternatíva — NSLock zárással a string(from:) és date(from:) műveletek idejére.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is