2013-04-19 5 views
8

Ich habe einige alte Protokolldateien, die ich analysieren muss - anscheinend wurde das Datum Zeit wie gespeichert: 18/12/2012 11:09:39 p.m. - Alle meine Versuche, diese zu analysieren, sind gescheitert. Ich bin völlig verloren auf diese - Jede Hilfe oder Richtung wäre toll!DateTime.Parse löst immer Ausnahme in einer bestimmten Kultur

CultureInfo cultureInfo = new CultureInfo("es-MX" , true); 
     string date = "18/12/2012 11:09:39 p.m."; 

     DateTime dt = new DateTime(2012 , 12 , 18 , 11 , 9 , 39).AddHours(12); 

     this.richTextBox1.Text += date + Environment.NewLine; 
     this.richTextBox1.Text += dt.ToString(cultureInfo) + Environment.NewLine; 
     this.richTextBox1.Text += dt.ToString() + Environment.NewLine; 

     foreach (var item in richTextBox1.Lines) 
     { 
      try 
      { 
       DateTime d= DateTime.Parse(item); 
       this.richTextBox1.Text += d.ToString() + Environment.NewLine ; 

      } 
      catch (Exception ee) 
      { 
       this.richTextBox1.Text += ee.Message + Environment.NewLine ; 

      } 
     } 
+1

** IMMER ** ... na ja ... in einer bestimmten Kultur +1 – phadaphunk

+1

Sie sind die Ausnahme abfangen, rechts Was ist –

+1

50% t.? er Zeit, mein Code funktioniert 100% der Zeit. – Brian

Antwort

3

Einige Daten sind korrekt in den Protokolldateien Einige haben die seltsame Formatierung, die in pm oder pm endet Alle oben genannten Methoden scheinen zu versagen - und ja, ich habe sie alle ausprobiert :( Das war mein hack/fix für das Problem:

 CultureInfo cultureInfo = new CultureInfo("es-MX" , true); 
    Date = DateTime.Parse(date.Replace("p. m." , "PM").Replace("p.m." , "PM").Replace("." , "").ToUpper() , cultureInfo); 
2

Verwenden Sie DateTime.TryParseExact(). Hier ist ein Beispiel, das ich in LINQPad ausgeführt habe.

void Main() 
{ 
    System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("es-MX" , true); 
    string date = "18/12/2012 11:09:39 p.m."; 

    DateTime dt = new DateTime(2012 , 12 , 18 , 11 , 9 , 39).AddHours(12); 

    DateTime d; 
    string[] styles = {"dd/MM/yyyy hh:mm:ss tt"}; // This doesn't have to be an array - could be string 
    DateTime.TryParseExact(date, styles, cultureInfo, System.Globalization.DateTimeStyles.None, out d); 

    d.Dump(); 
} 
+0

Das scheitert auch - nicht anders als der Code, den ich gepostet habe .... d = {1/1/0001 12:00:00} - Ich denke, die Tryparse ist fehlgeschlagen ... – BillyDvd

+0

@BillyDvd Einfach kopieren, einfügen und lief in LINQPad und es lief richtig. Versuche das zu tun. –

0

Verwenden Sie Ihre Variable cultureInfo als zweiten Parameter von Parse. Dies wird die Kultur als Formatanbieter nutzen.

DateTime d = DateTime.Parse(item, cultureInfo); 
+0

Großartige Köpfe denken gleich! –

+0

@Nicholas - leider habe ich die Kommentare unter der ursprünglichen Frage vor dem Einreichen nicht erweitert. Tony Hopkinson hat es vor uns beiden gepostet. – Dave

+0

Das Hinzufügen dieser gibt die Ausnahme: Die Zeichenfolge wurde nicht als gültige DateTime erkannt. Es gibt ein unbekanntes Wort, das bei Index 20 beginnt. – BillyDvd

0

Das Problem besteht darin, dass Sie nicht die Kultur angeben, die in Ihrem Aufruf von Parse() verwendet werden soll. Ihr Aufruf verwendet die Eigenschaft Current des aktuellen Threads:

DateTime d= DateTime.Parse(item); 

Die magische Beschwörung Sie brauchen, ist so etwas wie:

DateTime instance = DateTime.Parse(text , CultureInfo.GetCultureInfo("es-MX")) ; 

Ihre andere Alternative ist, den aktuellen Thread Kultur zu ändern:

CultureInfo mexico = CultureInfo.GetCultureInfo("es-MX"); 
Thread.CurrentThread.CurrentCulture = mexico; 

bevor Sie anrufen DateTime.Parse(). Mach das beim Start und du solltest gut gehen (solange du in mexikanischem Spanisch arbeitest, ist es gut für deine Zwecke. Beachte, dass das Ändern der aktuellen Kultur nichts an der Darstellung der Dinge ändert. Dafür ist die CurrentUICulture Eigenschaft des Threads zuständig.

+0

Führt immer noch die Ausnahme aus: Die Zeichenfolge wurde nicht als gültige DateTime erkannt. Es gibt ein unbekanntes Wort, das bei Index 20 beginnt. – BillyDvd

+0

@BillyDvd, haben Sie überprüft, was die tatsächlichen Zeichen in der fehlerhaften Zeichenfolge sind? Offset +20 in Ihrem Beispielstring ist der Kleinbuchstabe "p" in "p.m.". Ich bin bereit zu sein, dass du irgendwo schlechte Daten hast. Haben Sie mehrere Leerzeichen in der Zeichenfolge?Vielleicht möchten Sie die Whitespace-Behandlung mit einer der 'Parse()' Überladungen, die die Angabe von 'DateTimeStyles' unterstützen, lockern. –

Verwandte Themen