Date — is een Foundation-structuur die een specifiek moment in de tijd vertegenwoordigt, onafhankelijk van kalender en tijdzone. Het type slaat het aantal seconden op dat is verstreken sinds de referentiedatum 1 januari 2001 (reference date) en biedt basishandelingen voor vergelijking en berekening van tijdsintervallen. Volgens Apple Developer Documentation (2025) wordt Date gebruikt in alle Apple-frameworks: van UIKit en SwiftUI tot CloudKit en Core Data. Begrip van Date is verplicht voor elke iOS-ontwikkelaar, omdat het onmogelijk is om tijd in een app te beheren zonder Date.
Belangrijkste punten
Date — is een waardetype uit het Foundation-framework dat een enkel absoluut moment in de tijd vastlegt. In tegenstelling tot kalenderweergaven (jaar, maand, dag) is Date niet afhankelijk van tijdzone en kalendersysteem — het is een puur numerieke waarde van een tijdstempel.
De interne weergave van Date is een TimeInterval (alias voor Double) die het aantal seconden opslaat ten opzichte van de referentiedatum — 1 januari 2001 00:00:00 UTC. Apple koos deze datum in plaats van Unix epoch (1970) voor compatibiliteit met oude NeXTSTEP-systemen waarop iOS en macOS zijn gebouwd.
Date wordt gebruikt als standaard tijdstype in alle Apple API's: UIDatePicker, DatePicker, UserDefaults, Codable, Core Data, CloudKit. Zonder Date is het onmogelijk om te werken met schema's, timers, agenda-evenementen, gegevensserialisatie en alle tijdgerelateerde bewerkingen.
Date verschilt van kalendertypen doordat het een fysieke tijdstempel vertegenwoordigt, geen voor mensen leesbare waarde. Dezelfde Date kan overeenkomen met verschillende kalenderdatums in verschillende tijdzones. Om componenten (jaar, maand, dag) te verkrijgen, wordt Date omgezet via Calendar en DateComponents.
Date verschilt ook van DispatchTime, dat wordt gebruikt voor taakverdeling in Grand Central Dispatch. DispatchTime is relatief aan het moment van systeemopstart, terwijl Date een absolute stempel is die kan worden opgeslagen, verzonden en hersteld.
Date() — is de eenvoudigste manier om een object met het huidige tijdsmoment te maken. De initialisator zonder argumenten retourneert de exacte tijd van aanroep. Om een datum in het verleden of de toekomst te maken, worden TimeInterval en de methode addingTimeInterval of initialisatie vanuit een bestaande Date gebruikt.
Om een willekeurige datum uit componenten te maken, wordt de combinatie Calendar en DateComponents gebruikt. Calendar zet voor mensen leesbare componenten (jaar, maand, dag, uur, minuut) om in Date. Men kan ook Date initialiseren via ISO8601DateFormatter vanuit een string in ISO 8601-formaat of via DateFormatter vanuit een willekeurige stringweergave.
Date.distantPast en Date.distantFuture — twee statische eigenschappen die oneindig verre momenten in het verleden en de toekomst vertegenwoordigen. Ze worden gebruikt als grenswaarden bij het filteren en sorteren van datums in algoritmen.
import Foundation
// Date maken met huidige tijd
let now = Date()
print("Current time: \(now)")
// Datum over 1 uur (3600 seconden)
let inOneHour = now.addingTimeInterval(3600)
// Datum uit componenten
var components = DateComponents()
components.year = 2025
components.month = 12
components.day = 25
let christmas = Calendar.current.date(from: components)!
In het voorbeeld worden drie manieren getoond om Date te maken: huidige tijd, toevoegen van een interval en maken via DateComponents. Alle drie benaderingen retourneren een waarde van het type Date met millisecondeprecisie. Calendar.current gebruikt de systeemkalender van de gebruiker — op Apple-apparaten is dit meestal de gregoriaanse kalender.
TimeInterval — is een alias voor Double die het aantal seconden tussen twee tijdsmomenten vertegenwoordigt. De precisie van TimeInterval bereikt fracties van milliseconden, wat voldoende is voor de meeste toepassingstaken. Een negatieve TimeInterval-waarde geeft het verleden aan ten opzichte van het referentiepunt.
Date ondersteunt alle standaard vergelijkingsoperators: ==, <, >, <=, >=. Swift vergelijkt automatisch de interne TimeInterval van waarden. De methode compare retourneert een ComparisonResult met de varianten .orderedSame, .orderedAscending, .orderedDescending voor explicietere vergelijking.
Date.distance(to:) — methode die TimeInterval retourneert tot de opgegeven datum. Als de doeldatum in het verleden ligt, is het resultaat negatief. advanced(by:) maakt een nieuwe datum door de opgegeven TimeInterval aan de huidige datum toe te voegen. Deze methoden implementeren het Strideable-protocol, waardoor Date kan worden gebruikt in bereiken Range en ClosedRange.
let start = Date()
let end = start.addingTimeInterval(86400)
// Vergelijken via operators
if start < end {
print("start is earlier")
}
// TimeInterval tussen twee datums
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")
}
TimeInterval gelijk aan 86400 komt overeen met één dag. Voor complexere intervallen — weken, maanden, jaren — gebruik Calendar en DateComponents, omdat deze eenheden variabele lengte hebben (schrikkeljaren, zomertijd). TimeInterval is alleen van toepassing op vaste tussenpozen in seconden.
Calendar — is de brug tussen Date en voor mensen leesbare componenten. Calendar zet Date om in DateComponents (jaar, maand, dag, uur, minuut, seconde) rekening houdend met tijdzone en locale. Zonder Calendar is het onmogelijk om jaar of maand uit Date te halen — Date bevat deze informatie niet vanwege zijn absolute aard.
De methode Calendar.component haalt één component uit Date: jaar, maand, dag, uur, minuut, seconde, weekday, quarter. De methode Calendar.dateComponents haalt in één aanroep een set componenten op — dit is efficiënter dan het afzonderlijk aanroepen van component voor elk veld.
Calendar.isDateInToday, isDateInTomorrow, isDateInYesterday — handige methoden voor het controleren van relatieve datums. Calendar.dateInterval retourneert het begin en einde van de opgegeven periode (dag, week, maand, jaar). Calendar.compare vergelijkt datums met de precisie van de opgegeven component — bijvoorbeeld jaar zonder rekening te houden met maand en dag.
let calendar = Calendar.current
// Componenten extraheren
let year = calendar.component(.year, from: Date())
let month = calendar.component(.month, from: Date())
// Check relative date
if calendar.isDateInToday(someDate) {
print("Today!")
}
// Begin en einde van de dag
let dayInterval = calendar.dateInterval(of: .day, for: Date())!
print("Day start: \(dayInterval.start)")
print("Day end: \(dayInterval.end)")
Calendar.current gebruikt de systeeminstellingen van de gebruiker — kalender, tijdzone en locale. Voor testen of specifieke berekeningen kan men een Calendar met concrete parameters maken via Calendar(identifier: .gregorian) en de gewenste TimeZone instellen via de eigenschap timeZone.
DateFormatter — verplichte component als Date aan de gebruiker moet worden getoond. DateFormatter zet Date om in een string volgens het opgegeven formaat en locale. Directe omzetting van Date naar string via String(describing:) retourneert een technische weergave met reference date en TimeInterval — deze is niet bedoeld voor de gebruiker.
De basisbenadering is het gebruik van vooraf gedefinieerde stijlen dateStyle en timeStyle. iOS ondersteunt vier stijlen: .short, .medium, .long, .full. Combinatie van datum- en tijdstijlen maakt flexibele aanpassing van de weergave mogelijk. DateFormatter past automatisch lokalisatie toe: voor de Nederlandse locale wordt de datum weergegeven in het formaat \"21 juli 2026\".
ISO8601DateFormatter — een gespecialiseerde formatter voor ISO 8601, het meest gebruikte formaat voor API en gegevensuitwisseling. Deze formatter werkt sneller dan DateFormatter en is niet afhankelijk van locale, wat hem de voorkeur geeft voor serialisatie van datums in JSON.
// Vooraf gedefinieerde stijlen
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
let userString = formatter.string(from: Date())
// ISO 8601 voor API
let isoFormatter = ISO8601DateFormatter()
let apiString = isoFormatter.string(from: Date())
// Parseren uit string
let parsed = isoFormatter.date(from: "2026-07-21T10:30:00Z")!
Bij het werken met DateFormatter is het belangrijk om aan prestaties te denken: het maken van een nieuwe formatter is een dure operatie. Het wordt aanbevolen om de formatter te cachen of één keer te maken en opnieuw te gebruiken. In de eigenschappen van de formatter kan timeZone worden ingesteld — standaard wordt de systeemtijdzone gebruikt, maar voor serverdatums is vaak TimeZone(identifier: \"UTC\") nodig.
Laten we typische scenario's van werken met Date in een iOS-app bekijken. Het eerste scenario — leeftijd berekenen van de gebruiker uit de geboortedatum. Het tweede — afteltimer tot een gebeurtenis. Het derde — records groeperen op datum voor weergave in tabsecties.
Calendar.dateComponents met de vlag [.year] berekent het verschil tussen twee datums. Het instellen van de juiste tijdzone is kritisch — als u geen timeZone in Calendar opgeeft, kan het resultaat een dag afwijken vanwege het overschrijden van middernacht in een andere tijdzone.
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
}
Afteltimer wordt geïmplementeerd via TimeInterval. We berekenen het verschil tussen de doeldatum en de huidige datum, krijgen de rest in seconden en zetten deze om in dagen, uren, minuten. Voor regelmatige bijwerking wordt Timer met een interval van 1 seconde gebruikt. ObservableObject met de eigenschap @Published stelt SwiftUI in staat de interface automatisch bij te werken.
Groeperen op datum wordt geïmplementeerd via een woordenboek met sleutel Date. Calendar.dateInterval(of: .day, for:) normaliseert de datum tot het begin van de dag, waardoor records van dezelfde dag kunnen worden gegroepeerd. Dezelfde aanpak werkt voor weken, maanden en jaren — het volstaat om de component in dateInterval te wijzigen naar .weekOfYear of .month.
| Scenario | Belangrijkste API | Kenmerk |
|---|---|---|
| Leeftijd berekenen | Calendar.dateComponents | Houd rekening met timeZone |
| Afteltimer | Date.timeIntervalSince | Timer+Combine |
| Datums groeperen | Calendar.dateInterval | Normalisatie tot dag |
| JSON-serialisatie | ISO8601DateFormatter | Locale heeft geen invloed |
Veelgestelde vragen
Date — is een interne weergave van tijd zonder koppeling aan kalender en locale. Een string is een geformatteerde weergave die afhankelijk is van gebruikersinstellingen. Date kan met honderd procent nauwkeurigheid worden vergeleken, geserialiseerd en wiskundig verwerkt, terwijl een stringweergave altijd parsering via een formatter vereist.
Date — is een absolute tijdstempel (aantal seconden vanaf reference date) die niet afhankelijk is van tijdzone. Tijdzone is de context van weergave. Dezelfde Date in UTC en in Amsterdam vertegenwoordigt hetzelfde fysieke moment, maar wordt weergegeven als verschillende kalendertijd.
Date wordt direct ondersteund door Core Data als attribuuttype. Core Data serialiseert automatisch Date in de opslag. Voor query's met filtering op datum gebruikt u NSPredicate met vergelijkingsoperators — Core Data verwerkt timezone correct op SQLite-niveau.
CFAbsoluteTime — is een Core Foundation-type dat dezelfde referentiedatum gebruikt (1 januari 2001). Date en CFAbsoluteTime zijn onderling uitwisselbaar via directe conversie. Date(timeIntervalSinceReferenceDate:) accepteert CFAbsoluteTime, en Date.timeIntervalSinceReferenceDate retourneert CFAbsoluteTime.
Date heeft een nauwkeurigheid tot milliseconden, maar garandeert geen nanosecondenauwkeurigheid vanwege hardwarebeperkingen van iOS/macOS. Voor zeer nauwkeurige metingen gebruikt u mach_absolute_time of ContinuousClock uit Swift 5.7+, die werken op hardware-tellers van processorcycli.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook