Date — egy Foundation struktúra, amely egy adott időpillanatot reprezentál, függetlenül a naptártól és az időzónától. A típus tárolja a referencia dátumtól — 2001. január 1-jétől (reference date) — eltelt másodpercek számát, és alapvető összehasonlítási és időintervallum-számítási műveleteket biztosít. Az Apple Developer Documentation (2025) szerint a Date az összes Apple keretrendszerben használatos: az UIKit és SwiftUI-tól a CloudKit és Core Data-ig. A Date működésének megértése kötelező minden iOS fejlesztő számára, mert anélkül nem lehet kezelni az időt az alkalmazásban.
Főbb pontok
Date — egy értéktípus a Foundation keretrendszerből, amely egyetlen abszolút időpillanatot rögzít. A naptári reprezentációktól (év, hónap, nap) eltérően a Date nem függ az időzónától és a naptári rendszertől — ez egy pusztán numerikus időbélyeg érték.
A Date belső reprezentációja egy TimeInterval (alias a Double számára), amely a másodpercek számát tárolja a referencia dátumhoz — 2001. január 1. 00:00:00 UTC — képest. Az Apple ezt a dátumot választotta az Unix epoch (1970) helyett a régi NeXTSTEP rendszerekkel való kompatibilitás miatt, amelyekre az iOS és macOS épül.
A Date szabványos időtípusként használatos az összes Apple API-ban: UIDatePicker, DatePicker, UserDefaults, Codable, Core Data, CloudKit. Date nélkül nem lehet dolgozni ütemezésekkel, időzítőkkel, naptári eseményekkel, adatszerializációval és bármilyen idővel kapcsolatos művelettel.
Date abban különbözik a naptári típusoktól, hogy egy fizikai időbélyeget reprezentál, nem pedig egy ember által olvasható értéket. Ugyanaz a Date különböző naptári dátumoknak felelhet meg különböző időzónákban. Az összetevők (év, hónap, nap) lekéréséhez a Date-t a Calendar és DateComponents segítségével alakítjuk át.
Date eltér a DispatchTime-tól is, amelyet a Grand Central Dispatch feladatkiosztásához használnak. A DispatchTime a rendszer indításának pillanatához viszonyított, míg a Date egy abszolút bélyeg, amely menthető, továbbítható és visszaállítható.
Date() — a legegyszerűbb mód egy objektum létrehozására az aktuális időpillanattal. Az argumentum nélküli inicializáló visszaadja a hívás pontos idejét. A múltban vagy jövőben lévő dátum létrehozásához a TimeInterval és az addingTimeInterval metódus, vagy egy meglévő Date-ből történő inicializálás használatos.
Tetszőleges dátum létrehozásához összetevőkből a Calendar és DateComponents párost használjuk. A Calendar az ember által olvasható összetevőket (év, hónap, nap, óra, perc) Date-té alakítja. A Date ISO 8601 formátumú karakterláncbol is inicializálható az ISO8601DateFormatter segítségével, vagy tetszőleges karakterlánc reprezentációból a DateFormatter segítségével.
Date.distantPast és Date.distantFuture — két statikus tulajdonság, amelyek a múlt és a jövő végtelenül távoli pillanatait reprezentálják. Határértékként használatosak a dátumok szűrése és rendezése során algoritmusokban.
import Foundation
// Date létrehozása aktuális idővel
let now = Date()
print("Current time: \(now)")
// Dátum 1 óra múlva (3600 másodperc)
let inOneHour = now.addingTimeInterval(3600)
// Dátum összetevőkből
var components = DateComponents()
components.year = 2025
components.month = 12
components.day = 25
let christmas = Calendar.current.date(from: components)!
A példa három módot mutat a Date létrehozására: aktuális idő, intervallum hozzáadása és létrehozás DateComponents segítségével. Mindhárom megközelítés Date típusú értéket ad vissza ezredmásodperc pontossággal. A Calendar.current a felhasználó rendszernaptárát használja — Apple eszközökön ez általában a Gergely-naptár.
TimeInterval — egy alias a Double számára, amely két időpillanat közötti másodpercek számát reprezentálja. A TimeInterval pontossága ezredmásodperc töredékeit éri el, ami a legtöbb alkalmazási feladathoz elegendő. A negatív TimeInterval érték a múltat jelzi a referencia ponthoz képest.
A Date támogatja az összes szabványos összehasonlító operátort: ==, <, >, <=, >=. A Swift automatikusan összehasonlítja az értékek belső TimeInterval-ját. A compare metódus egy ComparisonResult értéket ad vissza .orderedSame, .orderedAscending, .orderedDescending változatokkal a kifejezettebb összehasonlításhoz.
Date.distance(to:) — metódus, amely TimeInterval-t ad vissza a megadott dátumig. Ha a cél dátum a múltban van, az eredmény negatív. advanced(by:) új dátumot hoz létre a megadott TimeInterval hozzáadásával az aktuális dátumhoz. Ezek a metódusok implementálják a Strideable protokollt, lehetővé téve a Date használatát Range és ClosedRange tartományokban.
let start = Date()
let end = start.addingTimeInterval(86400)
// Összehasonlítás operátorokkal
if start < end {
print("start is earlier")
}
// TimeInterval két dátum között
let interval: TimeInterval = end.timeIntervalSince(start)
print("Seconds: \(Int(interval / 60)) minutes")
// Using Date in range
let range = start...end
let mid = start.addingTimeInterval(43200)
if range.contains(mid) {
print("mid is between start and end")
}
A 86400-nal egyenlő TimeInterval egy napnak felel meg. Összetettebb intervallumokhoz — hetek, hónapok, évek — használja a Calendar és DateComponents objektumokat, mert ezek az egységek változó hosszúságúak (szökőévek, nyári időszámításra váltás). A TimeInterval csak fix másodpercben megadott közökre alkalmazható.
Calendar — a híd a Date és az ember által olvasható összetevők között. A Calendar a Date-t DateComponents-szé (év, hónap, nap, óra, perc, másodperc) alakítja, figyelembe véve az időzónát és a nyelvi beállításokat. Calendar nélkül nem lehet kinyerni az évet vagy hónapot a Date-ből — a Date abszolút természete miatt nem tartalmazza ezeket az információkat.
A Calendar.component metódus egy összetevőt nyer ki a Date-ből: év, hónap, nap, óra, perc, másodperc, weekday, quarter. A Calendar.dateComponents metódus egyetlen hívásban nyer ki egy összetevőhalmazt — ez hatékonyabb, mint a component metódus külön-külön történő meghívása minden mezőre.
Calendar.isDateInToday, isDateInTomorrow, isDateInYesterday — kényelmes metódusok relatív dátumok ellenőrzésére. Calendar.dateInterval visszaadja a megadott periódus (nap, hét, hónap, év) kezdetét és végét. Calendar.compare a dátumokat a megadott összetevő pontosságával hasonlítja össze — például évet a hónap és nap figyelmen kívül hagyásával.
let calendar = Calendar.current
// Összetevők kinyerése
let year = calendar.component(.year, from: Date())
let month = calendar.component(.month, from: Date())
// Check relative date
if calendar.isDateInToday(someDate) {
print("Today!")
}
// A nap kezdete és vége
let dayInterval = calendar.dateInterval(of: .day, for: Date())!
print("Day start: \(dayInterval.start)")
print("Day end: \(dayInterval.end)")
Calendar.current a felhasználó rendszerbeállításait használja — naptár, időzóna és nyelvi beállítás. Teszteléshez vagy speciális számításokhoz létrehozható egy Calendar konkrét paraméterekkel a Calendar(identifier: .gregorian) segítségével, és a kívánt TimeZone beállítható a timeZone tulajdonságon keresztül.
DateFormatter — kötelező komponens, ha a Date-t meg kell jeleníteni a felhasználónak. A DateFormatter a Date-t a megadott formátum és nyelvi beállítás szerint karakterlánccé alakítja. A Date közvetlen átalakítása karakterlánccé a String(describing:) segítségével egy technikai reprezentációt ad vissza reference date és TimeInterval értékkel — ez nem a felhasználónak szól.
Az alapvető megközelítés az előre meghatározott stílusok dateStyle és timeStyle használata. Az iOS négy stílust támogat: .short, .medium, .long, .full. A dátum és idő stílusok kombinációja lehetővé teszi a megjelenítés rugalmas testreszabását. A DateFormatter automatikusan alkalmazza a lokalizációt: magyar nyelvi beállítás esetén a dátum \"2026. július 21.\" formátumban jelenik meg.
ISO8601DateFormatter — egy speciális formázó az ISO 8601 számára, a legelterjedtebb formátum API-k és adatcsere számára. Ez a formázó gyorsabban működik, mint a DateFormatter, és nem függ a nyelvi beállítástól, ami előnyben részesíti a dátumok JSON-ban történő szerializálásánál.
// Előre meghatározott stílusok
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
let userString = formatter.string(from: Date())
// ISO 8601 API-hoz
let isoFormatter = ISO8601DateFormatter()
let apiString = isoFormatter.string(from: Date())
// Értelmezés karakterláncbol
let parsed = isoFormatter.date(from: "2026-07-21T10:30:00Z")!
A DateFormatter-rel végzett munka során fontos figyelembe venni a teljesítményt: új formázó létrehozása költséges művelet. Javasolt a formázó gyorsítótárba helyezése vagy egyszeri létrehozása és újrafelhasználása. A formázó tulajdonságai között beállítható a timeZone — alapértelmezetten a rendszer időzónája használatos, de szerver dátumokhoz gyakran TimeZone(identifier: \"UTC\") szükséges.
Tekintsük át a Date-szel való munka tipikus forgatókönyveit egy iOS alkalmazásban. Az első forgatókönyv — a felhasználó életkorának kiszámítása a születési dátumból. A második — visszaszámláló időzítő egy eseményig. A harmadik — bejegyzések dátum szerinti csoportosítása tábla szekciók formájában történő megjelenítéshez.
A Calendar.dateComponents a [.year] jelzővel kiszámítja a két dátum közötti különbséget. A helyes időzóna beállítása kritikus — ha nem ad meg timeZone-t a Calendar-ban, az eredmény egy nappal eltérhet az éjfél átlépése miatt egy másik időzónában.
func calculateAge(from birthDate: Date) -> Int {
let calendar = Calendar.current
let now = Date()
let components = calendar.dateComponents(
[.year], from: birthDate, to: now
)
return components.year ?? 0
}
Visszaszámláló időzítő a TimeInterval segítségével valósítható meg. Kiszámítjuk a cél dátum és az aktuális dátum közötti különbséget, megkapjuk a maradékot másodpercekben, és átalakítjuk napokká, órákká, percekké. A rendszeres frissítéshez 1 másodperc intervallumú Timer használatos. Az ObservableObject @Published tulajdonsággal lehetővé teszi a SwiftUI számára a felület automatikus frissítését.
Dátum szerinti csoportosítás egy Date kulcsú szótár segítségével valósítható meg. A Calendar.dateInterval(of: .day, for:) normalizálja a dátumot a nap elejére, ami lehetővé teszi az ugyanazon naphoz tartozó bejegyzések csoportosítását. Ugyanez a megközelítés működik hetekre, hónapokra és évekre — elegendő a dateInterval összetevőt .weekOfYear vagy .month értékre módosítani.
| Forgatókönyv | Kulcs API | Jellemző |
|---|---|---|
| Életkor számítás | Calendar.dateComponents | Vegye figyelembe a timeZone-t |
| Visszaszámlálás | Date.timeIntervalSince | Timer+Combine |
| Dátumok csoportosítása | Calendar.dateInterval | Normalizálás napig |
| JSON szerializáció | ISO8601DateFormatter | A Locale nem befolyásolja |
Gyakran Ismételt Kérdések
Date — az idő belső reprezentációja, naptár és nyelvi beállítás nélkül. A karakterlánc egy formázott megjelenítés, amely a felhasználó beállításaitól függ. A Date száz százalékos pontossággal összehasonlítható, szerializálható és matematikailag feldolgozható, míg a karakterlánc reprezentáció mindig formázón keresztüli értelmezést igényel.
Date — egy abszolút időbélyeg (másodpercek száma a reference date-től), amely nem függ az időzónától. Az időzóna a megjelenítés kontextusa. Ugyanaz a Date UTC-ben és Budapesten ugyanazt a fizikai pillanatot reprezentálja, de különböző naptári időként jelenik meg.
Date közvetlenül támogatott a Core Data által attribútumtípusként. A Core Data automatikusan szerializálja a Date-t a tárban. Dátum szerinti szűréssel rendelkező lekérdezésekhez használjon NSPredicate-t összehasonlító operátorokkal — a Core Data helyesen kezeli a timezone-t SQLite szinten.
CFAbsoluteTime — egy Core Foundation típus, amely ugyanazt a referencia dátumot használja (2001. január 1.). A Date és a CFAbsoluteTime közvetlen átalakítással felcserélhető. A Date(timeIntervalSinceReferenceDate:) elfogadja a CFAbsoluteTime-t, és a Date.timeIntervalSinceReferenceDate CFAbsoluteTime-t ad vissza.
Date ezredmásodperc pontossággal rendelkezik, de nem garantálja a nanoszekundum pontosságot az iOS/macOS hardverkorlátai miatt. Nagy pontosságú mérésekhez használja a mach_absolute_time vagy a Swift 5.7+-ból származó ContinuousClock objektumot, amelyek hardveres processzor ciklusszámlálókon működnek.
Ö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