2009-08-25 19 views
3

Ich habe einige Schwierigkeiten Parsing Strings von DateTime mit DateTime.ParseExact.Parsing DateTime Strings

DateTime result; 
    CultureInfo provider = CultureInfo.InvariantCulture; 

    // Parse date-only value with invariant culture. 
    //format = "mm/dd/yyyy"; 
format = "d"; 
    try 
    { 

     result = DateTime.ParseExact(data+" 12:00:00 AM", format, provider); 
    } 

Daten ist eine String-Variable geladen mit Daten des Formats "5/20/2009". Ich habe versucht, eine falsche Zeit anzuhalten, nur um zu sehen, ob das funktionieren würde, und es nicht (mit oder ohne die Wende). Ich habe auch versucht, mit dem "g" -Format Specifier und es hat nicht funktioniert, ich bekomme immer die Ausnahme, dass es keine gültige DateTime-String ist. Die einzigen Daten, für die es funktioniert, sind wie "12/20/2009" (2 Ziffern im "MM" Teil)

Ich kann diese Routine nicht mit einstelligen Monaten arbeiten! Microsofts eigenes Beispiel von MSDN ist

6/15/2009 1:45:30 PM -> 6/15/2009 (en-US)

und es wird nicht damit arbeiten. Ich verstehe nur nicht, was ich falsch mache. Ich habe auch meine eigenen Formatbezeichner wie "MM/TT/JJJJ" und "MM/TT/JJJJ" ausprobiert, aber ohne Erfolg.

Antwort

6

Wenn Sie ein Datetime in en-US-Format analysieren wollen, müssen Sie die Kultur en-US angeben:

DateTime.ParseExact("6/15/2009", "d", CultureInfo.GetCultureInfo("en-US")); 
+0

Warum muss ich diese Kultur angeben? Auch das ist nicht ParseExact. Wir wissen genau, aus welchem ​​Format die Datumszeichenfolgen stammen, warum kann eine Formatzeichenfolge nicht verwendet werden? Dadurch könnten wir Dinge einbringen, die nicht da sein sollten (die Angabe der Zeit in einem Datumsfeld ist ein Nein.) – Earlz

+0

Ich habe mein Beispiel in ParseExact geändert. Sie müssen eine Kultur angeben, weil Sie sagen, dass Ihre Eingabe in einer kulturspezifischen Weise (nämlich im US-amerikanischen Format) analysiert werden soll. – dtb

+0

Ok, ich dachte nur Invariant meinte US .. vielen Dank! – Earlz

4

Ich denke, die Sie verwenden möchten:

format = "M/dd/yyyy"; 

Hinweis nur 1 M.

Weitere Informationen finden Sie unter this article on MSDN.

+0

Nein, das ist falsch. Das wird es so machen, dass "11/15/2009" zu "1/15/2009" wird – Earlz

+2

Hast du es tatsächlich versucht? Weil ich habe, und es scheint zu funktionieren (15.11.2009 wird nicht 1/15/2009). Das 1 'M' zeigt einfach an, dass keine Null vor einstelligen Monaten hinzugefügt wird (ähnlich wie ToString ("0") auf einem Integer aufruft, gibt die Zahl ohne Auffüll-Nullen zurück). –

+0

Dan hat Recht. Du verstehst nicht, was die Formatzeichenfolge bedeutet, wenn du denkst, dass 11 -> 1 ohne das zusätzliche M konvertiert wird. – davewasthere

1

ParseExact setzt voraus, dass Sie die genaue lange Formatbezeichner (zB mm/tt /) statt nur „d“

+0

Das wird immer noch eine Ausnahme geben. Wenn ich eine "0" anwende, um etwas wie "20.06.2009" zu machen, dann parst es alles korrekt, aber der Monat wird 1 sein, also wird es "1/20/2009" sein und das macht nein Sinn. – Earlz

0

Das Zeichen ‚/‘ verwenden, wenn in Format-Strings verwendet wird, ist nur ein Platzhalter für den kultur- bestimmtes Datum Trennzeichen. Wenn Sie möchten, dass es sich um ein Literal handelt, müssen Sie es mit '\' verlassen.

Wenn ich Ihr Problem richtig verstanden können Sie in der Lage sein, Ihren Text zu analysieren, mit:

DateTime.ParseExact(data, "MM\/dd\/yyyy", CultureInfo.InvariantProvider); 
Verwandte Themen