DateFormatter: alapfogalmak, dátumformázás és lokalizáció

Szerző: IT Sectr Megjelenés: 2026-07-12 Olvasási idő: 7 perc

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 — osztály a Date átalakítására karakterlánccá és vissza, figyelembe véve a területi beállításokat és az időzónát.
  • dateStyle és timeStyle — előre definiált stílusok (.short, .medium, .long, .full) a gyors formázáshoz.
  • dateFormat — mintakarakterlánc egyedi formátumhoz, az Unicode LDML specifikáció szimbólumain keresztül meghatározva.
  • Locale és TimeZone — a formázó tulajdonságai, amelyek meghatározzák a regionális megjelenítést és az időzónát.
  • ISO8601DateFormatter — gyorsabb alternatíva az ISO 8601 formátumhoz API szérializációban.

Mi az a DateFormatter?

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 az iOS SDK-ban

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.

DateFormatter formázási stílusok

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ílusPélda (hu_HU)Példa (en_US)
.short2026. 07. 21.7/21/26
.medium2026. júl. 21.Jul 21, 2026
.long2026. július 21.July 21, 2026
.fullkedd, 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.

Egyedi formátumok a dateFormat segítségével

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.

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

Lokalizáció és TimeZone

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.

swift
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 és alternatívák

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.

swift
// 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.

Példák dátumformázásra

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.

Dátum megjelenítése hírlistában

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.

swift
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önyvFormázóKulcs beállítás
HírcsatornaRelativeDateFormatterunitsStyle = .full
Dátum beviteleDateFormatterdateFormat + fallback
API szérializációISO8601DateFormatterwithInternetDateTime
Jelentés exportDateFormatteren_US_POSIX + UTC

Gyakran Ismételt Kérdések

Miért ad vissza nil értéket a DateFormatter egy helyes karakterláncra?

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

Minden meghíváshoz ajat DateFormatter-t kell létrehozni?

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.

Miben különbözik a DateFormatter a RelativeDateFormatter-től?

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.

Hogyan kezeljem az időzóna nélküli dátumokat az API-ból?

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

Hogyan tehetem a DateFormatter-t szál-biztossá?

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ó

  • DateFormatter — Foundation osztály a Date átalakítására szöveggé és vissza, figyelembe véve a területi beállításokat, időzónát és a felhasználó naptárát.
  • Előre definiált stílusok dateStyle és timeStyle a .short, .medium, .long, .full változatokkal a legtöbb UI forgatókönyvet lefedik.
  • Egyedi dateFormat LDML szimbólumokon keresztül teljes kontrollt ad a formátum felett, de óvatosságot igényel a lokalizációval.
  • Locale és TimeZone — kötelező tulajdonságok a helyes megjelenítéshez: UI-hoz — rendszer locale, API-hoz — en_US_POSIX és UTC.
  • ISO8601DateFormatter — előnyben részesített választás a dátumok API-ban történő szérializálásához a sebesség és stabilitás miatt.
  • A DateFormatter nem szál-biztos — használjon külön példányokat minden szálhoz, vagy szinkronizálja a hozzáférést.
  • RelativeDateFormatter (iOS 15+) — optimális megoldás relatív dátumok megjelenítéséhez hírcsatornákban és üzenetküldőkben.

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.

Projekt megbeszélése

Olvassa el is