none
String to Date - Fehlermeldung mit [datetime]::ParseExact RRS feed

  • Frage

  • Hallo,

    ich lese aus einer Datei eine bestimmte Zeile, welche ein Datum im Format "Dienstag, 15. Oktober 2013" enthält, aus.

    $ContentDatum = (Get-Content "Datei.txt")[25]

    Jetzt ein kurzer Test:

    $ContentDatum.GetType()
    IsPublic IsSerial Name   BaseType
    -------- -------- ----   --------
    True     True     String System.Object  

    Dann möchte ich den String zu einem Date mittels [datetime]::ParseExact umwandeln.

    $VarDatum = [datetime]::ParseExact($ContentDatum,"%A, %d. %B %Y",$null)

    Fehlermeldung:

    Ausnahme beim Aufrufen von "ParseExact" mit 3 Argument(en):  "String was not recognized as a valid DateTime."
    In Zeile:1 Zeichen:1
    + $VarDatum = [datetime]::ParseExact($ContentDatum,"%A, %d. %B %Y",$null)
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : FormatException

    Ich finde den Fehler einfach nicht.

    Danke und Gruß

    • Bearbeitet notadmin Dienstag, 15. Oktober 2013 14:04 Kleinigkeiten ausgebessert
    Dienstag, 15. Oktober 2013 14:00

Antworten

  • Immer die Error Meldungen RICHTIG lesen!

    Hier wird eine FormatException geworfen.
    In  der Dokumentation steht zur FormatException steht:


    s oder format ist eine leere Zeichenfolge.
    - oder -
    s enthält kein Datum und keine Uhrzeit, die einem der in format angegebenen Muster entsprechen.
    - oder -
    Die Stundenkomponente und der AM/PM-Kennzeichner in s stimmen nicht überein.

    Dort ist nicht der IFormatProvider erwähnt!

    Der regelt "nur" die Culture einstellungen. Diese können bei einem richtigen FormatString Ignoriert werden ($Null).
    Der IFormatProvider sollte es also nicht sein.
    Siehe Dokumentation:
    http://msdn.microsoft.com/de-de/library/vstudio/w2sa9yss.aspx

    Ich glaube DateTime Akzeptiert nicht das UFormat mit den Prozentzeichen.
    Dies wird nur von dem Cmdlet Get-Date unterstützt!

    Get-Date "Sonntag, 05. Oktober 2003" -UFormat "%A, %d. %B %Y"

    Mit der DateTime Structure  geht das so:
    Siehe : Benutzerdefinierte und DateTime-Formatzeichenfolgen

    http://msdn.microsoft.com/de-de/library/vstudio/8kb3ddd4.aspx

    [datetime]::ParseExact("Dienstag, 15. Oktober 2013","dddd, dd. MMMM yyyy",$Null)


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    • Bearbeitet Peter Kriegel Dienstag, 15. Oktober 2013 16:55
    • Als Antwort vorgeschlagen Florian Reck Mittwoch, 16. Oktober 2013 05:50
    • Als Antwort markiert notadmin Mittwoch, 16. Oktober 2013 05:56
    Dienstag, 15. Oktober 2013 16:52

Alle Antworten

  • Hallo,

    das liegt wohl am IformatProvider ($null), wie das geht habe ich aber auch noch nicht herausgefunden. Wenn du das Datum als 15.10.2013 eingibst, tut es..

    Ich schau morgen noch weiter.

    Gruss

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...

    Dienstag, 15. Oktober 2013 15:00
  • Immer die Error Meldungen RICHTIG lesen!

    Hier wird eine FormatException geworfen.
    In  der Dokumentation steht zur FormatException steht:


    s oder format ist eine leere Zeichenfolge.
    - oder -
    s enthält kein Datum und keine Uhrzeit, die einem der in format angegebenen Muster entsprechen.
    - oder -
    Die Stundenkomponente und der AM/PM-Kennzeichner in s stimmen nicht überein.

    Dort ist nicht der IFormatProvider erwähnt!

    Der regelt "nur" die Culture einstellungen. Diese können bei einem richtigen FormatString Ignoriert werden ($Null).
    Der IFormatProvider sollte es also nicht sein.
    Siehe Dokumentation:
    http://msdn.microsoft.com/de-de/library/vstudio/w2sa9yss.aspx

    Ich glaube DateTime Akzeptiert nicht das UFormat mit den Prozentzeichen.
    Dies wird nur von dem Cmdlet Get-Date unterstützt!

    Get-Date "Sonntag, 05. Oktober 2003" -UFormat "%A, %d. %B %Y"

    Mit der DateTime Structure  geht das so:
    Siehe : Benutzerdefinierte und DateTime-Formatzeichenfolgen

    http://msdn.microsoft.com/de-de/library/vstudio/8kb3ddd4.aspx

    [datetime]::ParseExact("Dienstag, 15. Oktober 2013","dddd, dd. MMMM yyyy",$Null)


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    • Bearbeitet Peter Kriegel Dienstag, 15. Oktober 2013 16:55
    • Als Antwort vorgeschlagen Florian Reck Mittwoch, 16. Oktober 2013 05:50
    • Als Antwort markiert notadmin Mittwoch, 16. Oktober 2013 05:56
    Dienstag, 15. Oktober 2013 16:52
  • Hallo Peter,

    danke für die Klärung. Ist es korrekt, das der IformatProvider genutzt werden kann, wenn das Datum zum Beispiel im US-Format vorhanden ist, um es dann korrekt auf ein europäisches Format umzubiegen?

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...

    Mittwoch, 16. Oktober 2013 05:55
  • Guten Morgen,

    das funktioniert wirklich 1a!

    Bei

    $ContentDate = (Get-Content "Datei.txt")[25]
    $ContentTime = (Get-Content "Datei.txt")[28]
    $ContentDateTime = $ContentDate + " $ContentTime"

    kriege ich "Dienstag, 15. Oktober 2013 14:01:48" heraus und mittels

    $DateStr = [datetime]::ParseExact($ContentDateTime,"dddd, dd. MMMM yyyy HH:mm:ss",$null).ToString("yyyy-MM-dd-HH-mm")

    wird daraus ein "2013-10-15-14-01".

    Jetzt versuche ich nur noch die zwei Get-Content zu einem Befehl zusammenzufassen. :)

    Nochmals vielen Dank und Gruß aus dem Norden


    • Bearbeitet notadmin Mittwoch, 16. Oktober 2013 06:00 typo
    Mittwoch, 16. Oktober 2013 05:58
  • Ja!

    Es ist sogar besser IMMER den FormatProvider zu benutzten.

    Wenn kein Format Provider angegeben wird ($Null), dann wird die Windows System Einstellung ausgelesen und die Kultureinstellungen von Windows genutzt (CultureInfo).
    Aus der Kultureinstellung werden die Format Informationen für Datum ausgelesen (DateTimeFormatInfo).

    Das I in IFormatProvider sagt aus, das dort "nur" definiert wird wie eine Interface (Schnittstelle) von einem Objekt auszusehen hat. (Interface kann man sich wie eine definierte Steckverbindung vorstellen (Fachsprache: ein Vertrag))

    An der Stelle wo ein IFormatProvider erwartet wird,  wird jedes Objekt akzeptiert, das diese Schnittstelle bereitstellt.
    Deshalb kann man als IFormatProvider ein CultureInfo Objekt oder ein DateTimeFormatInfo Objekt übergeben.

    Dies geht z.B. auf einem deutschen System schief obwohl der Format String richtig ist:

    [datetime]::ParseExact("Tuesday, 15. October 2013","dddd, dd. MMMM yyyy",$Null)


    Das Funktioniert mit demselben Format String:

    [datetime]::ParseExact("Tuesday, 15. October 2013","dddd, dd. MMMM yyyy",[System.Globalization.CultureInfo]"en-US")

    Das Ergebnis ist dann ein DateTime Objekt. PowerShell benutzt dann wieder die System Kultur Einstellungen um aus dem DateTime Objekt ein Text als Datum anzuzeigen.
    Das DateTime Objekt enthält ja nur Zahlen die von der Kultur jeweils verschieden angezeigt werden.


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)


    Mittwoch, 16. Oktober 2013 08:32
  • Hallo Peter,

    danke für die umfangreiche und schöne Erklärung.

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...

    Mittwoch, 16. Oktober 2013 12:38