String in Date konvertieren

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Pinot.

    String in Date konvertieren

    Hallo zusammen,
    ich steh heut besonders auf dem Schlauch.
    Mein Problem ist folgendes. Aus einer Datei wird mir ein Datum in folgender Form geliefert:
    ""8/24/2017 3:15:08 PM""
    Sowohl Monat als auch Tag können ein oder zweisstellig sein

    Dieses Datum möchte ich eine als in Date Variabel überführen. Hier im Forum habe ich gefunden, das sich Date.parseexact dafür anbietet.
    Aber irgendwie kriege ich das nicht zustande.
    Hier mal mein Code Versuch:
    In TXT(1) steht der String aus der Datei
    Ich entferne die zusätzlichen Anführungszeichen und tausche den "/" gegen einen Punkt und versuche dann die Umwandlung.

    VB.NET-Quellcode

    1. Dim aZeit As String = TXT(1).Replace(Chr(34), "").Replace("/", ".").ToString
    2. Dim DatumV As Date = Date.ParseExact(aZeit, "MM.dd.yyyy hh:mm:ss AM/PM", Globalization.CultureInfo.InvariantCulture)

    Beim Ausführen kommt die Fehlermeldung "Die Zeichenfolge wurde nicht als gültiges DateTime erkannt."
    Was mache ich falsch?
    Ich könnte jetzt den String zerlegen und neu aufbauen, aber müßte es nicht mit dem ParseExact direkt gehen?

    Vielen Dank für jede Hilfe
    Bei dem Beispiel ist dein ParseExact falsch.

    VB.NET-Quellcode

    1. Dim DatumV As Date = Date.ParseExact(aZeit, "M.dd.yyyy h:mm:ss", Globalization.CultureInfo.InvariantCulture)


    So müsste es funktionieren, aber ich weiß nicht wie man mit "AM/PM" in Verbindung mit ParseExcat umgeht. Ich würde es splitten und von Hand parsen.

    Nachtrag, siehe hier. Ich bleibe dabei und würde von Hand parsen, es sei denn Du würdest Monat und Stunde auch mit den führenden Nullen erhalten können. Wie sehen die Tage aus, wenn sie < 10 sind?

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

    Hallo

    Folgendes sollte funktionieren:

    Date.ParseExact(aZeit, "M/dd/yyyy h:mm:ss tt", Globalization.CultureInfo.InvariantCulture)

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Das sieht mir schon nach einer amerikanischem Datum aus

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.Globalization
    4. Public Module Module1
    5. Public Sub Main()
    6. Dim sDate As String = """8/24/2017 3:15:08 PM"""
    7. sDate = sDate.Replace("""", "")
    8. Dim cult As CultureInfo = CultureInfo.CurrentCulture
    9. Dim cultDe As CultureInfo = New CultureInfo("de-DE")
    10. Dim cultUsa As CultureInfo = New CultureInfo("en-us")
    11. Dim sDateUsa = Date.Parse(sDate, cultUsa)
    12. Dim sDateCurr = sDateUsa.ToString(cult)
    13. Dim sDateDe = sDateUsa.ToString(cultDe)
    14. 'Von hier weg kannst du arbeiten
    15. 'Der für dich interessante einfach parsen fertig
    16. Dim DatumV = Date.Parse(sDateCurr)
    17. Stop
    18. End Sub
    19. End Module


    Kurzversion

    VB.NET-Quellcode

    1. Dim sDate As String = """8/24/2017 3:15:08 PM"""
    2. sDate = sDate.Replace("""", "")
    3. Dim DatumV = Date.Parse(sDate, New CultureInfo("en-us"))



    FAZIT
    Datentyp "Date" wird immer in der amerikanischen Version gezeigt
    Es ist nur über den String möglich, das Datum der Kultur entsprechend anzuzeigen.


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „exc-jdbi“ ()

    @Dksksm schön das du Code kritisierst wo "dein" code gar nicht laufen würde.
    Die Slashes sind schon richtig so. Im Beispiel vom TE sind die Slash ja so drinnen.
    Übrigens: das läuft auch z.b. eine Uhrzeit nach 10 Uhr. Nur so am Rande. Bitte erst probieren, dann kritisieren.

    Sicher macht es so nur sinn wenn es immer dieses Format sein wird. Der TE hat auch nichts anderes geschrieben, da die Werte nicht in einem UI eingegeben werden sondern aus eine File kommen darf auch davon ausgegangen werden solange der TE nix anderes schreibt.

    Edit: OK ein kleines d hatte ich leider zu viel:

    VB.NET-Quellcode

    1. Dim dateSting As String = "8/24/2017 11:15:08 PM"
    2. Dim test = Date.ParseExact(dateSting, "M/d/yyyy h:mm:ss tt", Globalization.CultureInfo.InvariantCulture)
    3. dateSting = "8/2/2017 11:15:08 PM"
    4. Dim test1 = Date.ParseExact(dateSting, "M/d/yyyy h:mm:ss tt", Globalization.CultureInfo.InvariantCulture)
    5. dateSting = "11/2/2017 11:15:08 PM"
    6. Dim test2 = Date.ParseExact(dateSting, "M/d/yyyy h:mm:ss tt", Globalization.CultureInfo.InvariantCulture)


    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

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

    So empfindlich "kenne" ich Dich gar nicht. Ausserdem habe ich nicht geschrieben, dass mein "Code" laufen würde, zumal ich das mit dem "tt" erst nnachträglich ermittel hatte.
    Getestet habe ich den Code auch nicht, auch nicht geschrieben, dass ich es getan hätte, aber auf der verlinkten Seite hatten andere genau das selbe Problem mit den ein- respektive zweistelligen Werten.
    Und ich selbst hatte ebenfalls die selben Probleme, aber das liegt ein paar Tage zurück und dort bin ich auf eine @exc-jdbi - ähnliche Lösung für mein Problem gekommen.
    @ alle
    vielen Dank für die schnelle Hilfe.

    Die Parseexact Methode habe ich nicht zum Laufen bekommen.
    Egal ob mit oder ohne getauschten Slashes.
    Die Fehlermeldung" Die Zeichenfolge wurde nicht als gültiges DateTime erkannt." bleibt.
    Keine Ahnung, was ich da falsch mache



    @exc-jdbi
    Deine Variante funktioniert im Einzelschritt recht gut.
    Wenn ich dann allerdings mit der Maus mir den Inhalt der Date Variabel anzeige lasse, zeigt mir das Programm die Variabel in dem Ami Format.

    Lasse ich das Programm durchlaufen,kommt es im weiteren Verlauf zum Fehler.
    Woran das liegt, entzieht sich meinen Verständnis.
    Hier die Fehlermeldung:
    Der Assistent für verwaltetes Debugging ""ContextSwitchDeadlock"" hat ein Problem in ""...\bin\Debug\Archiv.vshost.exe"" festgestellt.
    (mit dem Hinweis, das seit 60 Sekunden keine Meldung mehr verschickt wurde.)



    Ich habe jetzt den String auseinander gerupft und neu sortiert
    Jetzt läuft es mit einem einfachen Date.Parse.
    Die Sache ist nur etwas langsam.

    Ich mache jetzt erste einmal so weiter und probiere es in ein paar Tagen noch einmal.

    Also noch einmal ein Dankeschön an alle.

    Edit
    Ich hatte das geschrieben, bevor ich alle Antworten und Editionen gelesen hatte.
    Die ParseExact Methode

    VB.NET-Quellcode

    1. Dim DatumV As Date = Date.ParseExact(aZeit, "M.d.yyyy h:mm:ss tt", Globalization.CultureInfo.InvariantCulture)

    klappt und ist fix. Vielen Lieben Dank

    Mein Datensatz ist leider nicht ganz konsitent, Werte um genau 00:00:00 haben kein AM oder PM
    DAs ist mir erst beim Durchlaufen durch den Datensatz aufgefallen.
    Aber damit komme ich weiter.







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

    Pinot schrieb:

    ..."8/24/2017 3:15:08 PM"...

    Dieses Datum möchte ich eine als in Date Variabel überführen. Hier im Forum habe ich gefunden, das sich Date.parseexact dafür anbietet.
    Tut es nicht.
    Dein String ist scheints im invarianten Format formatiert, also nimm einfach Date.Parse() (ohne Exact), gib ihm CultureInfo.Invariant mit, und alles gut.