Date: mi ez, időtípus és TimeInterval a Foundationben

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

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 — Foundation struktúra, amely abszolút időpillanatot tárol a reference date-től számított másodpercek számaként.
  • TimeInterval — Double típus két időpillanat közötti intervallum másodpercekben történő reprezentálására.
  • Date() — inicializáló, amely a hívás pillanatában létrehoz egy objektumot az aktuális időpillanattal.
  • Dátumok összehasonlítása összehasonlító operátorokkal vagy compare, earlierDate, laterDate metódusokkal történik.
  • DateFormatter — kötelező komponens a dátum felhasználó számára történő megjelenítéséhez olvasható formátumban.

Mi az a Date a Foundationben?

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 más időtípusokkal szemben

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 létrehozása Swiftben

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.

swift
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 és dátumok összehasonlítása

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.

swift
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 és DateComponents

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.

swift
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 és dátummegjelenítés

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.

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

Példák a Date használatára

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.

Életkor kiszámítása születési dátumból

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.

swift
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önyvKulcs APIJellemző
Életkor számításCalendar.dateComponentsVegye figyelembe a timeZone-t
VisszaszámlálásDate.timeIntervalSinceTimer+Combine
Dátumok csoportosításaCalendar.dateIntervalNormalizálás napig
JSON szerializációISO8601DateFormatterA Locale nem befolyásolja

Gyakran Ismételt Kérdések

Miben különbözik a Date a dátumkarakterlánctól?

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.

Miért nem tartalmaz a Date információt az időzónáról?

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.

Milyen típust használjak az idő tárolására Core Data-ban?

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.

Mi a különbség a Date és a CFAbsoluteTime között?

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.

Használható a Date nagy pontosságú mérésekhez?

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ó

  • Date — Foundation értéktípus abszolút időpillanat tárolására TimeInterval-ként a 2001. január 1-jei reference date-től.
  • TimeInterval (Double) — másodpercek száma két dátum között, összehasonlítást és aritmetikát biztosít a Date-tel.
  • Calendar és DateComponents — az egyetlen mód az év, hónap, nap és más naptári összetevők kinyerésére a Date-ből.
  • DateFormatter és ISO8601DateFormatter — kötelező eszközök a dátumok szöveges formátumban történő megjelenítéséhez és szerializálásához.
  • Date.distantPast és Date.distantFuture — határértékek szűréshez és rendezéshez algoritmusokban.
  • A Date nem tartalmaz timezone-t — az időzóna a Calendar szintjén kerül hozzáadásra az összetevők megjelenítés céljából történő kinyerésekor.
  • A Core Data és Codable natívan támogatják a Date-t, ami leegyszerűsíti a dátumok tárolását és továbbítását további konverziók nélkül.

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