2016-05-19 16 views
3

Ich muss einen String-Extrakt aus einer Datei in datetime konvertieren. Das Problem ist, dass meine Zeichenfolge kein eindeutiges Format hat. Zum Beispiel kann meine Zeichenfolge etwas wie: 19-05-2016 1: 24: 09: 560 oder 19-05-2016 21: 24: 09: 56 oder 19-05-2016 10: 24: 09: 560 oder 19- 05-2016 10:24:09 und so weiter. Ich habe denen nicht alle Möglichkeiten noch (diese Saiten sind aus einer Json Antwort von einem API-Aufruf gezogen)C# - String in Datetime mit DateTime.ParseExact konvertieren

Dies ist, wie mein Code sieht aus wie

public static DateTime ConveDateTime(string a) 
{ 
    DateTime finished; 
    try 
    { 
     finished = DateTime.ParseExact(a, "dd-MM-yyyy HH:mm:ss:fff", CultureInfo.InvariantCulture, 
      DateTimeStyles.AssumeUniversal | 
      DateTimeStyles.AdjustToUniversal); 
    } 
    catch (Exception) 
    { 
     try 
     { 
      finished = DateTime.ParseExact(a, "dd-MM-yyyy HH:mm:ss:ff", CultureInfo.InvariantCulture, 
       DateTimeStyles.AssumeUniversal | 
       DateTimeStyles.AdjustToUniversal); 
     } 
     catch (Exception) 
     { 
      try 
      { 
       finished = DateTime.ParseExact(a, "dd-MM-yyyy HH:mm:ss:f", CultureInfo.InvariantCulture, 
        DateTimeStyles.AssumeUniversal | 
        DateTimeStyles.AdjustToUniversal); 
      } 
      catch (Exception) 
      { 
       try 
       { 
        finished = DateTime.ParseExact(a, "dd-MM-yyyy HH:mm:ss", CultureInfo.InvariantCulture, 
         DateTimeStyles.AssumeUniversal | 
         DateTimeStyles.AdjustToUniversal); 
       } 
       catch (Exception) 
       { 
        try 
        { 
         finished = DateTime.ParseExact(a, "dd-MM-yyyy H:mm:ss:fff", CultureInfo.InvariantCulture, 
          DateTimeStyles.AssumeUniversal | 
          DateTimeStyles.AdjustToUniversal); 
        } 
        catch (Exception) 
        { 
         try 
         { 
          finished = DateTime.ParseExact(a, "dd-MM-yyyy H:mm:ss:ff", CultureInfo.InvariantCulture, 
          DateTimeStyles.AssumeUniversal | 
          DateTimeStyles.AdjustToUniversal); 
         } 
         catch (Exception) 
         { 

          finished = DateTime.ParseExact(a, "dd-MM-yyyy H:mm:ss:f", CultureInfo.InvariantCulture, 
          DateTimeStyles.AssumeUniversal | 
          DateTimeStyles.AdjustToUniversal); 
         }        
        } 
       } 
      } 
     } 
    } 

    return finished; 
} 

Ich möchte wissen, ob es irgendeine bessere Lösung beim Konvertieren einer Zeichenfolge als die Lösung, die ich habe.

+1

Warum verwenden Sie nicht stattdessen TryParseExact()? –

+0

Und wie gehst du mit MM-TT-JJJJ-Format umgehen? –

Antwort

8

DateTime.ParseExact has an overload, das ein String-Array von möglichen Formaten für die Analyse verwendet. Verwenden Sie diese Überladung und reduzieren Sie Ihren Code auf eine oder zwei Zeilen.

string[] formats = new string[] {"dd-MM-yyyy HH:mm:ss:fff", 
           "dd-MM-yyyy H:mm:ss:fff", 
           "dd-MM-yyyy HH:mm:ss:f", 
           "dd-MM-yyyy HH:mm:ss", 
           ....}; 

finished = DateTime.ParseExact(a, formats, CultureInfo.InvariantCulture, 
       DateTimeStyles.AssumeUniversal | 
       DateTimeStyles.AdjustToUniversal); 

Wenn Sie nicht wissen, alle möglichen Formate Sie diese auch aus einer externen Datei der Anwendung zu vermeiden, lesen konnte neu zu kompilieren, wenn ein neues Format bis

auch erscheint, so wie es in den Kommentaren unten, Ich bevorzuge die Verwendung von DateTime.TryParseExact, um mehr Kontrolle über das Ergebnis des Parsens zu haben und eine kostspielige Ausnahmebehandlung im Falle eines nicht erkannten Formats zu vermeiden.

+2

Huh-wah!?!?! Ich benutze .NET seit 15 Jahren und wusste nie, dass Überlastung existiert ... Brilliant! –

+2

'Ich bin noch nicht auf alle Möglichkeiten gestoßen' ... und wenn Sie' TryparseExact' verwenden, können Sie diejenigen protokollieren, die fehlgeschlagen sind, damit Sie wissen, was Sie der Liste als gefunden hinzufügen müssen. – Plutonix

+0

Danke, das hat gut funktioniert. Und danke für die Idee mit dem Lesen der Formate von einer externen Datei, um Neukompilierung zu vermeiden. – Garnyatar

1

Was ist mit der Verwendung von DateTime.Parse() anstelle von DateTime.ParseExact()? DateTime.Parse() ist viel verzeihender als ParseExact. So müssen Sie nicht alle möglichen Formate definieren?

Verwandte Themen