Swift String to Date function mit verschiedenen Formaten

VonTobias Stephan

Swift String to Date function mit verschiedenen Formaten

Hier biete ich Dir eine kleine Klasse mit einer statischen Funktion, mit der Du problemlos ein String Wert in ein Date Format verwandeln kannst.

Datumsformate:
Wednesday, Sep 12, 2018           --> EEEE, MMM d, yyyy
09/12/2018                        --> MM/dd/yyyy
09-12-2018 14:11                  --> MM-dd-yyyy HH:mm
Sep 12, 2:11 PM                   --> MMM d, h:mm a
September 2018                    --> MMMM yyyy
Sep 12, 2018                      --> MMM d, yyyy
Wed, 12 Sep 2018 14:11:54 +0000   --> E, d MMM yyyy HH:mm:ss Z
2018-09-12T14:11:54+0000          --> yyyy-MM-dd'T'HH:mm:ssZ
12.09.18                          --> dd.MM.yy
10:41:02.112                      --> HH:mm:ss.SSS

Das passende Datumsformat habe ich hier fix in den Code gesetzt – das kannst Du natürlich auch noch hübscher machen.

class Tools {

    public static func ConvertStringToDate(DateValue: String) -> Date {
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
        let date = formatter.date(from: DateValue)
        return date!
    }

}

Hier ein Praxisbeispiel. Der String Wert befindet sich in der auskommentierten Zeile. In diesem Beipsiel ging es darum, ein XML-File von einem Websearver auszulesen und ein Wiedervorlagedatum in das richtige Date Format zu bringen. Spätestens beim Debuggen erkennt man das vorliegende Format oder man schaut sich das XML-File einfach online an.

//s["Wiedervorlage"]    String?    "2020-02-09T15:24:21.693+01:00"    
let dDate :Date = Tools.ConvertStringToDate(DateValue: s["Wiedervorlage"]!)

Das Setzen des Gebietsschemas auf en_US_POSIX wird beim Parsen von Daten von einem Server dringend empfohlen, um Probleme mit den lokalen Einstellungen des Geräts zu vermeiden. Für einige Hintergrundinformationen darüber gibt bei den TECH NOTES von Apple.

formatter.locale = Locale(identifier: "en_US")
formatter.dateStyle = .short

formatter.string(from: date) // returns 12/10/2018

//Als Beispiel UK
formatter.locale = Locale(identifier: "en_GB")
formatter.string(from: date) // returns 10/12/18
//Man beachte das zweistellige Jahr

//...wenn wir in Deutschland sind...

formatter.locale = Locale(identifier: "de_DE")
formatter.string(from: date) // returns 10.12.18
Turns out the periods are the accepted standard. In addition, DateFormatter has already translated names for you, so you don't have to worry about it:

//...oder aber in Spanien
formatter.locale = Locale(identifier: "es_ES") 
formatter.dateStyle = .long
formatter.string(from: date) // returns "10 de diciembre, 2018"

Über den Autor

Tobias Stephan administrator

Schreibe eine Antwort