Datumsangaben in Swift formatieren

von @ralfebert · aktualisiert am 26. Juli 2021

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