Date ist eine Foundation-Struktur, die einen bestimmten Zeitpunkt unabhängig von Kalender und Zeitzone darstellt. Der Typ speichert die Anzahl der Sekunden, die seit dem Referenzdatum 1. Januar 2001 vergangen sind, und bietet grundlegende Operationen zum Vergleichen und Berechnen von Zeitintervallen. Laut Apple Developer Documentation (2025) wird Date in allen Apple-Frameworks verwendet: von UIKit und SwiftUI bis zu CloudKit und Core Data. Das Verständnis der Funktionsweise von Date ist für jeden iOS-Entwickler unerlässlich, da ohne sie die Zeitverwaltung in einer Anwendung unmöglich ist.
Wichtige Erkenntnisse
Date ist ein Werttyp aus dem Foundation-Framework, der einen einzigen absoluten Zeitpunkt erfasst. Im Gegensatz zu Kalenderdarstellungen (Jahr, Monat, Tag) hängt Date nicht von der Zeitzone oder dem Kalendersystem ab — es ist ein rein numerischer Zeitstempelwert.
Die interne Darstellung von Date ist TimeInterval (ein Typalias für Double), der die Anzahl der Sekunden relativ zum Referenzdatum speichert — 1. Januar 2001, 00:00:00 UTC. Apple wählte dieses Datum anstelle der Unix-Epoche (1970) aus Kompatibilitätsgründen mit legacy NeXTSTEP-Systemen, auf denen iOS und macOS aufgebaut sind.
Date wird als Standardzeittyp in allen Apple-APIs verwendet: UIDatePicker, DatePicker, UserDefaults, Codable, Core Data, CloudKit. Ohne Date ist es unmöglich, mit Zeitplänen, Timern, Kalenderereignissen, Datenserialisierung und allen zeitbezogenen Operationen zu arbeiten.
Date unterscheidet sich von Kalendertypen dadurch, dass es einen physischen Zeitstempel und keinen menschenlesbaren Wert darstellt. Dasselbe Date kann in verschiedenen Zeitzonen unterschiedlichen Kalenderdaten entsprechen. Zum Extrahieren von Komponenten (Jahr, Monat, Tag) wird Date über Calendar und DateComponents konvertiert.
Date unterscheidet sich auch von DispatchTime, das für die Aufgabenverteilung in Grand Central Dispatch verwendet wird. DispatchTime ist relativ zum Systemstartzeitpunkt, während Date ein absoluter Zeitstempel ist, der gespeichert, übertragen und wiederhergestellt werden kann.
Date() ist der einfachste Weg, ein Objekt mit dem aktuellen Zeitpunkt zu erstellen. Der parameterlose Initialisierer gibt die genaue Zeit des Aufrufs zurück. Um ein Datum in der Vergangenheit oder Zukunft zu erstellen, verwenden Sie TimeInterval und die Methode addingTimeInterval oder die Initialisierung von einem vorhandenen Date.
Um ein beliebiges Datum aus Komponenten zu erstellen, verwenden Sie das Paar Calendar und DateComponents. Calendar konvertiert menschenlesbare Komponenten (Jahr, Monat, Tag, Stunde, Minute) in Date. Sie können Date auch über ISO8601DateFormatter aus einem ISO-8601-String oder über DateFormatter aus einer beliebigen String-Darstellung initialisieren.
Date.distantPast und Date.distantFuture sind zwei statische Eigenschaften, die unendlich weit entfernte Momente in der Vergangenheit und Zukunft darstellen. Sie werden als Grenzwerte zum Filtern und Sortieren von Daten in Algorithmen verwendet.
import Foundation
// Date mit aktueller Zeit erstellen
let now = Date()
print("Current time: \(now)")
// Datum in 1 Stunde (3600 Sekunden)
let inOneHour = now.addingTimeInterval(3600)
// Datum aus Komponenten
var components = DateComponents()
components.year = 2025
components.month = 12
components.day = 25
let christmas = Calendar.current.date(from: components)!
Das Beispiel zeigt drei Möglichkeiten zum Erstellen eines Date: aktuelle Zeit, Hinzufügen eines Intervalls und Erstellen über DateComponents. Alle drei Ansätze geben einen Wert vom Typ Date mit Millisekundengenauigkeit zurück. Calendar.current verwendet den Systemkalender des Benutzers — auf Apple-Geräten ist dies typischerweise der gregorianische Kalender.
TimeInterval ist ein Typalias für Double, der die Anzahl der Sekunden zwischen zwei Zeitpunkten darstellt. Die Genauigkeit von TimeInterval erreicht Bruchteile einer Millisekunde, was für die meisten praktischen Aufgaben ausreicht. Ein negativer TimeInterval zeigt die Vergangenheit relativ zum Referenzpunkt an.
Date unterstützt alle Standardvergleichsoperatoren: ==, <, >, <=, >=. Swift vergleicht automatisch die internen TimeInterval-Werte. Die Methode compare gibt ComparisonResult mit den Optionen .orderedSame, .orderedAscending, .orderedDescending für einen expliziteren Vergleich zurück.
Date.distance(to:) ist eine Methode, die den TimeInterval bis zum angegebenen Datum zurückgibt. Wenn das Zieldatum in der Vergangenheit liegt, ist das Ergebnis negativ. advanced(by:) erstellt ein neues Datum, indem der angegebene TimeInterval zum aktuellen hinzugefügt wird. Diese Methoden implementieren das Strideable-Protokoll und ermöglichen die Verwendung von Date in Range und ClosedRange.
let start = Date()
let end = start.addingTimeInterval(86400)
// Vergleich mit Operatoren
if start < end {
print("start is earlier")
}
// TimeInterval zwischen zwei Daten
let interval: TimeInterval = end.timeIntervalSince(start)
print("Seconds: \(Int(interval / 60)) minutes")
// Date in einem Bereich verwenden
let range = start...end
let mid = start.addingTimeInterval(43200)
if range.contains(mid) {
print("mid is between start and end")
}
TimeInterval von 86400 entspricht einem Tag. Für komplexere Intervalle — Wochen, Monate, Jahre — verwenden Sie Calendar und DateComponents, da diese Einheiten variable Längen haben (Schaltjahre, Sommerzeit). TimeInterval ist nur für feste Intervalle in Sekunden anwendbar.
Calendar ist die Brücke zwischen Date und menschenlesbaren Komponenten. Calendar konvertiert Date unter Berücksichtigung von Zeitzone und Gebietsschema in DateComponents (Jahr, Monat, Tag, Stunde, Minute, Sekunde). Ohne Calendar ist es unmöglich, das Jahr oder den Monat aus Date zu extrahieren — Date enthält diese Informationen aufgrund seiner absoluten Natur nicht.
Die Methode Calendar.component extrahiert eine einzelne Komponente aus Date: Jahr, Monat, Tag, Stunde, Minute, Sekunde, Wochentag, Quartal. Die Methode Calendar.dateComponents extrahiert einen Satz von Komponenten in einem einzigen Aufruf — dies ist effizienter, als component für jedes Feld einzeln aufzurufen.
Calendar.isDateInToday, isDateInTomorrow, isDateInYesterday sind praktische Methoden zum Überprüfen relativer Daten. Calendar.dateInterval gibt den Beginn und das Ende des angegebenen Zeitraums (Tag, Woche, Monat, Jahr) zurück. Calendar.compare vergleicht Daten mit einer Genauigkeit bis zur angegebenen Komponente — zum Beispiel Jahr ohne Berücksichtigung von Monat und Tag.
let calendar = Calendar.current
// Komponenten extrahieren
let year = calendar.component(.year, from: Date())
let month = calendar.component(.month, from: Date())
// Relatives Datum prüfen
if calendar.isDateInToday(someDate) {
print("Today!")
}
// Beginn und Ende des Tages
let dayInterval = calendar.dateInterval(of: .day, for: Date())!
print("Day start: \(dayInterval.start)")
print("Day end: \(dayInterval.end)")
Calendar.current verwendet die Systemeinstellungen des Benutzers — Kalender, Zeitzone und Gebietsschema. Für Tests oder spezifische Berechnungen können Sie einen Calendar mit bestimmten Parametern über Calendar(identifier: .gregorian) erstellen und die gewünschte Zeitzone über die Eigenschaft timeZone festlegen.
DateFormatter ist eine erforderliche Komponente, wenn Date dem Benutzer angezeigt werden muss. DateFormatter konvertiert Date entsprechend dem angegebenen Format und Gebietsschema in einen String. Die direkte Konvertierung von Date in einen String über String(describing:) gibt eine technische Darstellung mit dem Referenzdatum und TimeInterval zurück — sie ist nicht für Benutzer bestimmt.
Der grundlegende Ansatz besteht darin, die voreingestellten Stile dateStyle und timeStyle zu verwenden. iOS unterstützt vier Stile: .short, .medium, .long, .full. Die Kombination von Datums- und Zeitstilen ermöglicht eine flexible Anzeigekonfiguration. DateFormatter wendet automatisch die Lokalisierung an: für das russische Gebietsschema wird das Datum im Format „21. Juli 2026“ angezeigt.
ISO8601DateFormatter ist ein spezialisierter Formatierer für ISO 8601, das häufigste Format für APIs und Datenaustausch. Dieser Formatierer arbeitet schneller als DateFormatter und ist nicht vom Gebietsschema abhängig, was ihn für die Serialisierung von Daten in JSON bevorzugt macht.
// Voreingestellte Stile
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
let userString = formatter.string(from: Date())
// ISO 8601 für API
let isoFormatter = ISO8601DateFormatter()
let apiString = isoFormatter.string(from: Date())
// Parsing aus String
let parsed = isoFormatter.date(from: "2026-07-21T10:30:00Z")!
Bei der Arbeit mit DateFormatter ist es wichtig, die Leistung zu beachten: Das Erstellen eines neuen Formatierers ist eine teure Operation. Es wird empfohlen, den Formatierer zwischenzuspeichern oder einmal zu erstellen und wiederzuverwenden. Die Eigenschaften des Formatierers ermöglichen das Festlegen von timeZone — standardmäßig wird die Systemzeitzone verwendet, aber für Serverdaten ist häufig TimeZone(identifier: „UTC“) erforderlich.
Betrachten wir typische Szenarien für die Arbeit mit Date in einer iOS-Anwendung. Das erste Szenario ist die Berechnung des Alters aus dem Geburtsdatum des Benutzers. Das zweite ist ein Countdown-Timer bis zu einem Ereignis. Das dritte ist die Gruppierung von Datensätzen nach Datum zur Anzeige als Tabellenabschnitte.
Calendar.dateComponents mit dem Flag [.year] berechnet die Differenz zwischen zwei Daten. Die korrekte Einstellung der Zeitzone ist entscheidend — wenn Sie timeZone in Calendar nicht angeben, kann das Ergebnis aufgrund des Übergangs um Mitternacht in einer anderen Zeitzone um einen Tag abweichen.
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
}
Countdown-Timer wird mit TimeInterval implementiert. Berechnen Sie die Differenz zwischen dem Ziel- und dem aktuellen Datum, erhalten Sie den Rest in Sekunden und konvertieren Sie ihn in Tage, Stunden, Minuten. Für regelmäßige Aktualisierungen verwenden Sie Timer mit einem Intervall von 1 Sekunde. Ein ObservableObject mit einer @Published-Eigenschaft ermöglicht SwiftUI, die Oberfläche automatisch zu aktualisieren.
Gruppierung nach Datum wird mit einem Dictionary mit Date als Schlüssel implementiert. Calendar.dateInterval(of: .day, for:) normalisiert das Datum auf den Beginn des Tages, sodass Sie Datensätze gruppieren können, die zum selben Tag gehören. Derselbe Ansatz funktioniert für Wochen, Monate und Jahre — ändern Sie einfach die Komponente in dateInterval in .weekOfYear oder .month.
| Szenario | Wichtige API | Hinweise |
|---|---|---|
| Altersberechnung | Calendar.dateComponents | timeZone beachten |
| Countdown | Date.timeIntervalSince | Timer+Combine |
| Datumsgruppierung | Calendar.dateInterval | Auf Tag normalisieren |
| JSON-Serialisierung | ISO8601DateFormatter | Locale hat keinen Einfluss |
Häufig gestellte Fragen
Date ist eine interne Darstellung der Zeit ohne Bindung an Kalender und Gebietsschema. Ein String ist eine formatierte Anzeige, die von den Benutzereinstellungen abhängt. Date kann mit 100% Genauigkeit verglichen, serialisiert und mathematisch verarbeitet werden, während die String-Darstellung immer eine Analyse durch einen Formatierer erfordert.
Date ist ein absoluter Zeitstempel (Anzahl der Sekunden ab dem Referenzdatum), der nicht von der Zeitzone abhängt. Die Zeitzone ist ein Anzeigekontext. Dasselbe Date in UTC und in Moskau stellt denselben physikalischen Moment dar, wird aber als unterschiedliche Kalenderzeit angezeigt.
Date wird nativ von Core Data als Attributtyp unterstützt. Core Data serialisiert Date automatisch in den Speicher. Für Abfragen mit Datumsfilterung verwenden Sie NSPredicate mit Vergleichsoperatoren — Core Data behandelt die Zeitzone auf SQLite-Ebene korrekt.
CFAbsoluteTime ist ein Core Foundation-Typ, der dasselbe Referenzdatum (1. Januar 2001) verwendet. Date und CFAbsoluteTime sind durch direkte Konvertierung austauschbar. Date(timeIntervalSinceReferenceDate:) akzeptiert CFAbsoluteTime, und Date.timeIntervalSinceReferenceDate gibt CFAbsoluteTime zurück.
Date hat Millisekundengenauigkeit, garantiert jedoch aufgrund von iOS/macOS-Hardwareeinschränkungen keine Nanosekundengenauigkeit. Für hochpräzise Messungen verwenden Sie mach_absolute_time oder ContinuousClock aus Swift 5.7+, die auf Hardware-Prozessorzyklenzählern arbeiten.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch