Datum parsen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von strzata.

    Datum parsen

    Hallo,
    im Header von erhaltenen Mails steht als Datumsangabe z.B.
    Date: Wed, 08 Mar 2023 13:49:05 +0100
    Den Substring ab dem 7. Zeichen
    Wed, 08 Mar 2023 13:49:05 +0100
    muss ich in einen Date/Time String umwandeln

    Quellcode

    1. Dim dateValue As DateTime
    2. datum = "Wed, 08 Mar 2023 13:49:05 +0100"
    3. If DateTime.TryParse(datum, dateValue) Then
    4. datum = CDate(datum).ToString("dd.MM.yy HH:mm")

    Ich erhalte 08.03.23 13:49
    Richtig wäre aber 08.03.23 14:49
    Natürlich könnte ich im Vb Code beim Parsen des Headers per Hand korrigierend eingreifen und 1 Stunde dazuzählen. Aber gibts keine Funktion, die mir gleich den richtigen Wert liefert?

    Danke! VG Norbert

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Zum einen würde an sich erstmal reichen DateTime.TryParse(datum, dateValue), da in dateValue dann schon das Ergebnis drinsteckt.
    Aber: Einer von uns hat einen Denkfehler: Der Ausgangstext bedeutet doch: Dort, wo es gesendet wurde, ist es 13:49:05 und es ist dort eine Stunde später als in Greenwich (Nullzeitpunkt). Also ist in Greenwich 12:49:05 und am Absendeort 13:49:05. Wie kommst Du daher auf 14:49:05? Sommerzeit?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke für Deine schnelle Antwort!

    Die Mail, die ich erhalte, ist die Antwort auf eine Mail, die ich hingesendet habe. Ich habe die Anforderung für die Antwort um 14:48 Uhr gesendet. Eine Minute später, also um 14:49 traf die Antwort hier ein. Manchmal vergehen auch ein paar Minuten mehr. Die Antwort kann aber keinesfalls früher erstellt/gesendet worden sein als 14:48.

    Bei manchen Rückantworten von den Gematik-Servern steht da auch manchmal
    Date: Mon, 20 Mar 2023 12:35:10 +0100 (CET)
    Da muss ich das (CET) wegschneiden, sonst parst es mir .Net überhaupt nicht.
    Es ist eine Crux, dass ich nichts finden kann, was in allen Eventualitäten funktioniert ...

    Ich stelle in einem Grid nebeneinander Anfrage -- Antwort
    Und da sieht es für meine Anwender blöd aus, wenn da steht
    Anfrage 14:48
    Antwort 13:49

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „strzata“ ()

    @strzata Wenn Du mit DateTime.TryParseExact() parst, kannst Du Dein Format direkt vorgeben: learn.microsoft.com/de-de/dotn…ryparseexact?view=net-7.0
    Wenn das Format nicht stimmt, gibt es eine Exception.
    So kannst Du mehrere Formate nacheinander ausprobieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Uff … Gematik. Die hat zwar ne FAQ-Excelliste rausgebracht, aber da werd ich bei Frage Q_0782 auch nicht schlauer.
    Letztenendes könntest Du ggf. alle Möglichkeiten von Ist- und Sollwerten hier mal auflisten, vielleicht ergibt sich daraus was.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Was Du so alles ausgräbst =O Hab die Tabelle noch nie gesehen. Ja, verstehe Q_0782 auch nicht.
    Im Moment schlägt bei mir nur
    Date: Mon, 20 Mar 2023 12:35:10 +0100 (CET)
    Date: Wed, 08 Mar 2023 13:49:05 +0100

    auf. Ich schneide, wenn vorhanden (CET) weg und dann lässt es sich gut parsen. Lediglich das Problem mit +xxxx müsste noch geknackt werden.
    Wer weiss, was später noch alles so kommt.
    @strzata Mit Deinen Leerzeichen bekomme ich kein Beispiel hin.
    Probier aber mal alle Beispiele auf der verwiesenen Web-Seite aus.

    strzata schrieb:

    das Problem mit +xxxx
    ist doch kein Problem. Wenn es vorganden ist, addierst Du eine Stunde auf das Ergebnis:

    VB.NET-Quellcode

    1. dateValue = dateValue.AddHours(-1)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Dim datum = "Wed, 08 Mar 2023 13:49:05 +0100"
    2. Dim Result = Date.ParseExact(datum, "ddd, dd MMM yyyy HH:mm:ss zzz", Globalization.CultureInfo.InvariantCulture)
    Soweit ich das verstehe, stimmt aber das Ergebnis theoretisch mit 13:49. Wir befinden uns derzeit in der MEZ, also GMT + 1 Stunde. Da der Datumstext in der gleichen Zeitzone "ist", also die Angabe macht: hey, ich bin in der MEZ, ist eben die Zeit mit 13:49 für uns unverändert. Entweder versteh ich es falsch oder es liegt ein Fehler im Text vor.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    OK, die InvariantCulture war es.

    VB.NET-Quellcode

    1. Dim Result As DateTime
    2. Dim datum = "Wed, 08 Mar 2023 13:49:05 +0100"
    3. Dim format = "ddd, dd MMM yyyy HH:mm:ss zzz"
    4. If Date.TryParseExact(datum, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, Result) Then
    5. Label1.Text = Result.ToString
    6. Else
    7. Label1.Text = "nix"
    8. End If
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da kommt aber 12:49 raus. Er will aber 14:49
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Er will aber 14:49
    das kommt mit -0100.
    @strzata Was sagt die Definition davon?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Puuh, jetzt schwirrt mir der Kopf total. Ich glaube, ich hab einen Fehler im Code. #10 lässt eigentlich keinen anderen Schluss zu. Könnte sein, dass ich mich beim Substring verzählt habe und dadurch der String nicht korrekt geparst wurde. Das prüfe ich morgen. Die sehr interessanten Codes von #10 und #11 haben mich viel gelehrt. Damit werde ich auch noch rumspielen. "zzz" war mir überhaupt nicht geläufig. Ebenso ist #13 absolutes Neuland für mich und ein Test scheint lohnenswert. Man weiss bei der Gematik ja nie, was denen noch so einfällt.

    Ihr alle habt vielen Dank, dass ihr mit mir diesen steinigen Weg gegangen seid!
    Viele Grüße
    Norbert
    Info am Rande: die Angabe +0001 gibt die Zeitzone an, in welcher sich die Uhrzeit befindet. Siehe de.wikipedia.org/wiki/ISO_8601#Zeitzonen

    Insofern müsste man in DE derzeit nichts umrechnen. Der Mail-Header ist daher meiner Meinung nach eindeutig falsch.

    Nachtrag: Habe mal diverse Mails bei mir geprüft und dort ist es überall korrekt. Thu, 23 Mar 2023 01:00:02 +0100 (CET) = gesendet um 1 Uhr nach der deutschen Winterzeit.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Hatte heute endlich Zeit, um mich nochmal um mein Problem zu kümmern. Hatte einen Fehler im Code. Beim Substring ein Digit zu kurz gesprungen. Dadurch kommt eine völlig falsche Zeit zustande:

    Quellcode

    1. datum = "Fri, 24 Mar 2023 15:21:24 +0100"
    2. date.ParseExact(datum, "ddd, dd MMM yyyy HH:mm:ss zzz", Globalization.CultureInfo.InvariantCulture)

    ergibt #3/24/2023 03:21:24 PM#
    also völlig korrekt, während

    Quellcode

    1. CDate("Fri, 24 Mar 2023 15:21:24 +010").ToString("dd.MM.yy HH:mm")

    ergibt 24.03.23 16:11

    Mit eurer Hilfe habe ich nun auch das richtige TryParseExact angewendet, welches mir True oder False liefert. Das hatte ich bislang umsegelt, weil ich DateTimeStyles nicht kannte.

    Quellcode

    1. Dim dateValue As DateTime
    2. Dim format As String = "ddd, dd MMM yyyy HH:mm:ss zzz"
    3. datum = zeile.Substring(5).Trim.Substring(0, 31)
    4. If DateTime.TryParseExact(datum, format, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, dateValue) Then
    5. datum = CDate(datum).ToString("dd.MM.yy HH:mm")
    6. Else
    7. datum = Date.Now.ToString("dd.MM.yy HH:mm")
    8. End If

    Damit sind 90% der Probleme gelöst. Jetzt interessiert mich noch sehr, was Marcus geschrieben hat.

    @Marcus Gräfe
    Hast Du ne Möglichkeit gefunden, dass die Angabe CET oder noch schwieriger (CET) gleich richtig geparst wird? Oder Hast Du es vor dem Parsen auch erst "weggeschnitten"? Im Moment prüfe ich es auf Existenz und reagiere darauf entsprechend. Aber vielleicht geht es eleganter?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „strzata“ ()

    Warum benutzt du eigentlich CDate und nebenbei, du hast in dateValue schon das Datum, da kannst du einfach dein ToString... dran hängen.