Formatieren eines Datums

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

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2021 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • Formatieren eines Datums

    Hallo zusammen!

    Ich habe gleich zwei Probleme mit dem Formatieren eines Datums. Meine App liest Daten aus einer Webdatenbank und soll diese nun dem Objekt "Kunde" zuordnen:


    Quellcode

    1. let datum_string = jsonDict["geburtsdatum"]!
    2. print("Datumstring ist \(datum_string)")
    3. let formatter = DateFormatter()
    4. formatter.timeZone = .current
    5. formatter.locale = .current
    6. formatter.dateFormat = "yyyy-MM-dd"
    7. kunde.geburtsdatum = formatter.date(from: datum_string)!
    8. print("Das daraus gebildete Datum ist \(kunde.geburtsdatum)")
    Die Ausgabe in der Konsole

    Datumstring ist 2016-06-20

    würde mich vermuten lassen, dass das Gleiche in mein Datumsobjekt gespeichert wird, doch nein! Wo wäre da sonst die ganze Spannung?... Tatsächlich erzeugt die nächste print-Anweisung folgende Ausgabe:

    Das daraus gebildete Datum ist 2016-06-19 22:00:00 +0000

    Am meisten irritiert mich dabei, dass aus dem 20. Juni der 19. Juni wurde. Desweiteren finde ich es nicht ganz cool, das da noch eine Uhrzeit etc. dran hängt - eigentlich hätte ich gerne nur ein Datum, offensichtlich habe ich das Format doch nicht richtig eingegeben. Hat jemand Vorschläge, wie ich es besser machen kann?
  • Date ist ein struct, das einen Zeitpunkt repräsentiert, also beinhaltet es implizit die Tageszeit. Ausgegeben wird es als string in GMT, daher wird aus 00:00 im Juni eben 22:00 am Vortag. Wie Date bei einer print-Ausgabe dargestellt wird, bestimmt seine description-Methode - darauf solltest Du Dich nicht verlassen und schon gar nicht diesen String weiterverwenden. Nutze einfach einen passenden DateFormatter, um kunde.geburtsdatum kontrolliert in einen String umzuwandeln ... ganz zufällig hast Du ja schon einen passenden :)

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von MyMattes ()

  • Das Problem an einem Geburtstag ist, dass er eigentlich nicht genau definiert wird denn er wird ja auf ein Datum "heruntergebrochen". Würden wir das Geburtsdatum
    tatsächlich mit Uhrzeit speichern wann man geboren wurde, dann wäre es ja so, dass man in einer anderen Zeitzone an einem anderen Tag geboren wäre.
    Ich bin z.B. am 9.5. um 5:35 geboren. Damit bin ich in Amerika aber am 8.5. geboren.Sehr verwirrend oder?

    Deshalb ist es immer Mist, wenn man zu einem Geburtstag eine Zeitinformation mit speichert was aber automatisch passiert wenn du den String in ein internes Date Format umwandelst.

    Je nach Anwendungsfall kann es auch einfacher sein sich sein Datums format für die Ausgabe schnell selbst zusammen zu basteln.

    String localDate = datum_string.substr(7 , 2) + "." + datum_string.substr(5,2) + "." + datum_string.substring(0,4);

    Damit kannst du natürlich keine voreingestellten Locale benutzen.

    Was ich an Deiner Stelle aber unbedingt machen würde: Speicher den String in deinem Object auch als String in genau dem Format wie du ihn bekommst und ändere ihn nur zur Ausgabe. Ich habe mir abgewöhnt variablen als Date zu speichern eben weil es die Sache nur unnötig kompliziert macht. Bei mir sind alle Datum und Zeiten in einem ISO8601 formatierten String gespeichert und das immer als UTC. Damit habe ich durchgängig die gleiche Zeit in meiner App und nur wenn ich etwas an den User ausgebe errechne ich mir daraus die passende lokale Zeit mit dem entsprechenden Format.
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)