2016-05-19 12 views
3

文字列抽出をファイルからdatetimeに変換する必要があります。問題は、私の文字列にユニークなフォーマットがないことです。たとえば、私の文字列は、19-05-2016 1:24:09:560または19-05-2016 21:24:09:56または19-05-2016 10:24:09:560または19- 05-2016 10:24:09など。私はこれは私がどんながあるかどうかを知りたいc# - DateTime.ParseExactを使用して文字列をdatetimeに変換する

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; 
} 

のように私のコードがどのように見えるかである(これらの文字列は、APIコールからのJSONレスポンスから引き出され)まだ

をすべての可能性に遭遇しませんでした私が持っている解決策よりも文字列を変換するには良い解決策です。

+1

代わりにTryParseExact()を使用しないでください。 –

+0

MM-dd-yyyy形式はどうやって扱いますか? –

答えて

8

DateTime.ParseExact has an overloadは、解析に使用できる形式の文字列を取ります。そのオーバーロードを使用し、コードを1行または2行に減らします。

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); 

あなたはすべての可能なフォーマットがわからない場合、あなたはまた、下記のコメントで述べたように、新しいフォーマットは、また

をポップアップする場合は、アプリケーションを再コンパイルを避けるために、外部ファイルからそれらを読むことができます私はDateTime.TryParseExactを使用して、構文解析の結果をより詳細に制御し、フォーマットが認識されない場合に高価な例外処理を回避することを推奨します。

+2

ハァッハー!?!?!私は.NETを15年間使用していて、過負荷が存在することを知らなかった...素晴らしい! –

+2

'私はまだすべての可能性に遭遇していませんでした。 'そして' TryParseExact'を使用した場合は、失敗したものを記録して、リストに何を追加するかを知ることができます。 – Plutonix

+0

ありがとう、それはうまくいった。そして、再コンパイルを避けるために、外部ファイルからフォーマットを読み込んでいただきありがとうございます。 – Garnyatar

1

DateTime.ParseExact()の代わりにDateTime.Parse()を使用することはどうですか? DateTime.Parse()はParseExactよりはるかに寛容です。 この方法で、すべての可能なフォーマットを定義する必要はありませんか?

関連する問題