Datumsangaben in Swift formatieren
Vorgefertigte Datumsstile
Mit der Foundation-Klasse DateFormatter können Datumsangaben formatiert werden. Dabei gibt es vorgefertige Formatierungs-Stile zur Auswahl - es empfiehlt sich, diese zu verwenden, da die Lokalisierung in andere Sprachen damit automatisch funktioniert (jede Sprache hat eigene Regeln zur Formatierung von Datumsangaben):
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .medium
let formattedString = formatter.string(for: Date())
Folgende Stile gibt es zur Auswahl:
date | time | |
---|---|---|
.short | 12.07.19 | 17:09 |
.medium | 12.07.2019 | 17:09:12 |
.long | 12. Juli 2019 | 17:09:12 MESZ |
.full | Freitag, 12. Juli 2019 | 17:09:12 Mitteleuropäische Sommerzeit |
Hinweis: Ab iOS 15 gibt es ein neues API zur Formatierung von Datumswerten:
Date.now.formatted(date: .abbreviated, time: .shortened)
Date.now.formatted(.dateTime.year().month().day())
Eigene Datumsformate
Mit der Eigenschaft dateFormat können eigene Datumsformate definiert werden (die dabei verwendbaren Patterns/Formatierungsregeln können im Unicode-Standard nachgelesen werden):
let customFormatter = DateFormatter()
customFormatter.dateFormat = "eeee, dd.MM."
let customString = customFormatter.string(for: Date())
ISO 8601
Für den Austausch von Datumswerten empfiehlt sich die Verwendung des ISO 8601-Formates:
let isoFormatter = ISO8601DateFormatter()
isoFormatter.timeZone = TimeZone.current
isoFormatter.string(from: Date())
isoFormatter.date(from: "2019-07-12T17:09:12+02:00")
Ab iOS 15:
Date.now.formatted(.iso8601)
Tipp: Datumsformate zentral definieren
Seit iOS 10 sind DateFormatter thread-safe. Daher empfiehlt es sich, anwendungsweit benötigte Datumsformatierungen einheitlich und zentral zu definieren, z.B. in einer Datei Formatter.swift:
struct Formatter {
/// 12.03.2021
static let mediumDate: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .medium
return formatter
}()
/// 12.03.2021 12:34
static let mediumDateAndTime: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
return formatter
}()
}
Tipp: Datumswerte formatieren via String Interpolation
Die String Interpolation Syntax \(...) um Werte in Strings einzusetzen kann mit einer Extension zu DefaultStringInterpolation um neue Funktionen erweitert werden.
In SwiftUI gibt es eine solche Extension standardmäßig und Datumswerte können direkt formatiert werden:
struct ExampleView : View {
var body: some View {
Text("Heute ist der \(Date(), formatter: Formatter.mediumDate)")
}
}
Mit einer eigenen Extension zu DefaultStringInterpolation kann diese Schreibweise auch in beliebigen Strings verwendet werden:
extension DefaultStringInterpolation {
mutating func appendInterpolation(_ value: Date, formatter: DateFormatter) {
self.appendInterpolation(formatter.string(from: value))
}
}
Weitere Informationen
-
DateFormatterAPI-Dokumentation der DateFormatter-Klasse.
-
NSHipster: FormatterArtikel im NSHipster-Blog zu den Formatter-Klassen in der Standard-Library von Swift.
-
Date Format patternsDefinition der Patterns für Datumsformate im Unicode-Standard.
-
ExpressibleByStringInterpolationArtikel zur Erweiterung der String Interpolation in Swift.