dateFormatter Date to String to Date

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • dateFormatter Date to String to Date

    Guten Abend,

    ich probiere seit zwei Tagen den "dateFormatter" zu begreifen, aber das Ding will nicht so wie ich möchte.

    Es geht um folgenden Fall - der Aufbau:

    Quellcode

    1. UserDefaults.standard.set(Date(), forKey: "myDateAndTime") // per Button gefüllt
    2. let myDateAndTime = UserDefaults.standard.object(forKey: "myDateAndTime")
    Jetzt brauche ich den Date-Wert als String:

    Quellcode

    1. let now = myDateAndTime as! Date
    2. let formatter = DateFormatter()
    3. formatter.timeZone = TimeZone.current
    4. formatter.dateFormat = "YYYY-MM-dd HH:mm:ss a"
    5. let dateString = formatter.string(from: now)
    6. print(dateString) // Ausgabe: "2019-04-13 21:08:25 PM" -- klappt
    Jetzt brauche ich aus dem String wieder ein Date():

    Quellcode

    1. let dateFormatter = DateFormatter()
    2. dateFormatter.dateFormat = "YYYY-MM-dd HH:mm:ss a"
    3. dateFormatter.timeZone = TimeZone.current
    4. let date = dateFormatter.date(from: dateString)
    5. print(date) // Ausgabe: "Optional(2019-04-13 10:08:25 +0000)"
    Was genau ist jetzt hier passiert?

    Die erste Ausgabe (String) zeigt meine deutsche Zeit (wie die Mac-Uhr).

    Die zweite Ausgabe (Date) zeigt eine Stunde später und morgens?

    Ich benötige die richtige aktuelle Zeit abhängig von der auf dem iPhone ausgewählten Systemsprache) als String und die Möglichkeit den String zu Date() zurückzuwandeln.

    Kann mir jemand zeigen wo der Fehler liegt?

    Ich danke euch!

    LG
    Neu in der IOS-App-Entwicklungswelt - Spannend, ab und an nervenaufreibend, aber am Ende einfach faszinierend. Seid bitte nicht zu streng wenn ich Fragen einmal doppelt stelle, ich lerne noch :saint:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von CodeNerd ()

  • Nachdem Du myDateAndTime aus den UserDefaults geholt hast, gibt doch einfach mal myDateAndTime per

    Quellcode

    1. print(myDateAndTime)
    aus.

    Neben der timeZone musst Du ggf. auch die locale passend setzen.

    Sollte die Zeit bei der Angabe von AM/PM nicht jeweils 12 Stunden haben? Die Angabe "21:08:25 PM" scheint mir bei Verwendung von AM/PM daher nicht korrekt zu sein, oder?

    Um die Stunden auf jeweils 12 Stunde mit AM/PM zu erhalten, sollte das dateFormat eher "YYYY-MM-dd hh:mm:ss a" sein.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MCDan ()

  • Hey MCDan,

    sorry, dass ich jetzt erst antworte, aber ich bekomme sehr oft leider keine Benachrichtigungen von diesem Forum hier, dass eine Antwort verfügbar ist. Warum weiß ich leider nicht.

    MCDan schrieb:

    Nachdem Du myDateAndTime aus den UserDefaults geholt hast, gibt doch einfach mal myDateAndTime per

    Quellcode

    1. print(myDateAndTime)


    aus.
    Kein Problem so sieht es dann aus:


    Quellcode

    1. UserDefaults.standard.set(Date(), forKey: "myDateAndTime")
    2. let myDateAndTime = UserDefaults.standard.object(forKey: "myDateAndTime")
    3. print(myDateAndTime)
    4. // Optional(2019-04-17 00:32:41 +0000)
    5. -- um 02:32 Uhr morgens deutsche Zeit
    6. -- Simulator ist auf Sprache English & Region United States


    Die Ausgabe ist also zwei Stunden zurück.

    Das kann ich dann so korrigieren:


    Quellcode

    1. let dateformatter = DateFormatter()
    2. dateformatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss a ZZZZ"
    3. let now = dateformatter.string(from: myDateAndTime as! Date)
    4. print(now)
    5. // Ausgabe: 2019-04-17T02:32:41 AM GMT+02:00


    Teste ich das jetzt auf einem iPhone direkt mit Sprache auf Deutsch und Region auf Deutsch dann bekomme ich das gleiche Ergebnis:

    Ausgabe "myDateAndTime" > Optional(2019-04-17 01:05:25 +0000)


    Also das bedeutet, dass ich zwar schon auf dem richtigen Weg bin, aber noch nicht die richtigen Zeiten habe. Denn sowohl en_US als auch de_DE geben mir jeweils die Uhrzeit um zwei Stunden zurück?

    Hast du eine Idee?
    Neu in der IOS-App-Entwicklungswelt - Spannend, ab und an nervenaufreibend, aber am Ende einfach faszinierend. Seid bitte nicht zu streng wenn ich Fragen einmal doppelt stelle, ich lerne noch :saint:
  • MCDan schrieb:




    Sollte die Zeit bei der Angabe von AM/PM nicht jeweils 12 Stunden haben? Die Angabe "21:08:25 PM" scheint mir bei Verwendung von AM/PM daher nicht korrekt zu sein, oder?

    Um die Stunden auf jeweils 12 Stunde mit AM/PM zu erhalten, sollte das dateFormat eher "YYYY-MM-dd hh:mm:ss a" sein.
    Ja da hast du natürlich Recht. Die Ausgabe war doch nicht so ganz richtig, wie in meinem ersten Post beschrieben, aber ich muss ja für die englischen App-Nutzer AM & PM verwenden und das auch irgendwie berechnen, oder nicht?

    Dieses Zeit Thema macht mich echt kirre :S
    Neu in der IOS-App-Entwicklungswelt - Spannend, ab und an nervenaufreibend, aber am Ende einfach faszinierend. Seid bitte nicht zu streng wenn ich Fragen einmal doppelt stelle, ich lerne noch :saint:
  • Wenn du Formtstrings benutzt musst du für jedes Land einen eigenen haben.

    Du kannst mit dateStyle undtimeStyle arbeiten

    Quellcode

    1. let now = Date()
    2. let formatter = DateFormatter()
    3. formatter.timeZone = TimeZone.current
    4. formatter.dateStyle = .short
    5. formatter.timeStyle = .medium
    6. formatter.locale = Locale.current
    7. var dateString = formatter.string(from: now)
    8. print(dateString)
    9. formatter.locale = Locale(identifier: "en_US")
    10. dateString = formatter.string(from: now)
    11. print(dateString)
    Alles anzeigen
    Raus kommt
    17.04.19, 10:20:38
    4/17/19, 10:20:38 AM

    ist dir das zu unflexibel nimm dateFormat(fromTemplate:options:locale:)

    Quellcode

    1. let now = Date()
    2. let formatter = DateFormatter()
    3. formatter.timeZone = TimeZone.current
    4. formatter.locale = Locale.current
    5. var formatString = DateFormatter.dateFormat(fromTemplate: "YYYYMMdd HHmmss j", options: 0, locale: Locale.current)
    6. formatter.dateFormat = formatString
    7. var dateString = formatter.string(from: now)
    8. print(dateString)
    9. formatter.locale = Locale(identifier: "en_US")
    10. formatString = DateFormatter.dateFormat(fromTemplate: "YYYYMMdd HHmmss j", options: 0, locale: Locale(identifier: "en_US"))
    11. formatter.dateFormat = formatString
    12. dateString = formatter.string(from: now)
    13. print(dateString)
    Alles anzeigen
    Raus kommt

    17.04.2019, 10:24:03
    04/17/2019, 10:24:03 AM
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • Manchmal hilft Dokumentation lesen… ;)

    developer.apple.com/documentat…r/1415241-localizedstring
    developer.apple.com/documentat…matter/1408112-dateformat

    Quellcode

    1. print(irgendeinDate)

    weiss nichts von Formaten, die der Anwender gerne haben möchte. Es ist zwar ziemlich lästig, wenn das Datum für den 23. Februar plötzlich am 22.2, um 23:00 Uhr liegt - aber das sind eher generelle Probleme von NSDate (überhaupt ist das ganze Thema ungeheuer kompliziert, und eigentlich hat jede Bibliothek, die mit Kalenderdaten arbeitet, irgendwelche hässlichen Stellen).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von t-no ()

  • Chris schrieb:

    Wenn du Formtstrings benutzt musst du für jedes Land einen eigenen haben.

    Du kannst mit dateStyle undtimeStyle arbeiten

    Quellcode

    1. let now = Date()
    2. let formatter = DateFormatter()
    3. formatter.timeZone = TimeZone.current
    4. formatter.dateStyle = .short
    5. formatter.timeStyle = .medium
    6. formatter.locale = Locale.current
    7. var dateString = formatter.string(from: now)
    8. print(dateString)
    9. formatter.locale = Locale(identifier: "en_US")
    10. dateString = formatter.string(from: now)
    11. print(dateString)
    Alles anzeigen
    Raus kommt
    17.04.19, 10:20:38
    4/17/19, 10:20:38 AM

    ist dir das zu unflexibel nimm dateFormat(fromTemplate:options:locale:)

    Quellcode

    1. let now = Date()
    2. let formatter = DateFormatter()
    3. formatter.timeZone = TimeZone.current
    4. formatter.locale = Locale.current
    5. var formatString = DateFormatter.dateFormat(fromTemplate: "YYYYMMdd HHmmss j", options: 0, locale: Locale.current)
    6. formatter.dateFormat = formatString
    7. var dateString = formatter.string(from: now)
    8. print(dateString)
    9. formatter.locale = Locale(identifier: "en_US")
    10. formatString = DateFormatter.dateFormat(fromTemplate: "YYYYMMdd HHmmss j", options: 0, locale: Locale(identifier: "en_US"))
    11. formatter.dateFormat = formatString
    12. dateString = formatter.string(from: now)
    13. print(dateString)
    Alles anzeigen
    Raus kommt

    17.04.2019, 10:24:03
    04/17/2019, 10:24:03 AM

    hey Chris,

    ich danke dir! Durch deine Hilfe läufts jetzt endlich :thumbsup:

    LG
    Neu in der IOS-App-Entwicklungswelt - Spannend, ab und an nervenaufreibend, aber am Ende einfach faszinierend. Seid bitte nicht zu streng wenn ich Fragen einmal doppelt stelle, ich lerne noch :saint:
  • t-no schrieb:

    Manchmal hilft Dokumentation lesen… ;)

    developer.apple.com/documentat…r/1415241-localizedstring
    developer.apple.com/documentat…matter/1408112-dateformat

    Quellcode

    1. print(irgendeinDate)
    weiss nichts von Formaten, die der Anwender gerne haben möchte. Es ist zwar ziemlich lästig, wenn das Datum für den 23. Februar plötzlich am 22.2, um 23:00 Uhr liegt - aber das sind eher generelle Probleme von NSDate (überhaupt ist das ganze Thema ungeheuer kompliziert, und eigentlich hat jede Bibliothek, die mit Kalenderdaten arbeitet, irgendwelche hässlichen Stellen).

    Hallo t-no,

    vielen Dank für deine Antwort. Ich hatte die Dokumentationen bereits gelesen und eben wie schon vorher beschrieben alle möglichen Dinge ausprobiert, kam aber nicht zum Ziel. Jetzt hats endlich Dank Chris geklappt. :thumbsup:
    Neu in der IOS-App-Entwicklungswelt - Spannend, ab und an nervenaufreibend, aber am Ende einfach faszinierend. Seid bitte nicht zu streng wenn ich Fragen einmal doppelt stelle, ich lerne noch :saint: