2012-03-30 9 views
6

私は"MM/dd/yyyy h:mmt"の行に沿ってカスタムフォーマット文字列を持つ.NETのDateTime.ParseExactを呼び出しています。この文字列は4桁の年を処理しますが、2桁の年を処理しません。単一のParseExact呼び出しで両方のケースを処理する方法はありますか?私は"MM/dd/yy h:mmt"を試して、2桁の大文字小文字しか扱っていません。DateTime.ParseExactを1回呼び出すだけで、2桁と4桁の年の両方をどのように受け入れることができますか?

答えて

19

あなたはParseExactのこのオーバーロードの第二引数のフォーマット文字列の配列を渡すことができます - これは2と4年間のバリアントの両方が含まれます。あなたの日付文字列は、ユーザーの現在のカルチャに合わせてローカライズされている場合nullDateTimeFormatInfo.CurrentInfoを通過し、第三引数には

DateTime dt = 
    DateTime.ParseExact(s, new[] { "MM/dd/yyyy h:mmt", "MM/dd/yy h:mmt" }, null, 0); 

;:

DateTime.ParseExact(myDateTime, 
        new []{"MM/dd/yy h:mmt", "MM/dd/yyyy h:mmt"}, 
        CultureInfo.InvariantCulture, 
        DateTimeStyles.None) 
+0

おかげ。これは素晴らしい。フォーマットはアレイに表示される順序で試行されていますか?最初に4桁の数字を入力する方がよいでしょうか? –

+0

@WilliamGross - ドキュメントでは指定されていませんが、可能性があります。パースする文字列の大部分が4桁の年を持つ場合は、最初に4桁の書式を指定する方がよいでしょう。 – Oded

0

あなたはいつもちょうどappropriate overloadを使用することができます。

var date = DateTime.ParseExact(dateString, 
           new[] { "MM/dd/yyy h:mmt", "MM/dd/yy h:mmt" }, 
           new CultureInfo("en-US"), 
           DateTimeStyles.None); 
3

が可能なフォーマットの配列を受け取りDateTime.ParseExactのオーバーロードを呼び出し日付文字列が常に米国の形式の場合は、DateTimeFormatInfo.InvariantInfoを渡します。

第4引数の場合、0はDateTimeStyles.Noneに相当します。

MSDN Library documentationを参照してください。

1

フォーマットの文字列配列をとるオーバーロードされたDateTime.ParseExactを使用します。

MSDN:

string[] formats= {"MM/dd/yyyy h:mmt", "MM/dd/yy h:mmt"}; 


var dateTime = DateTime.ParseExact(dateString, formats, 
             new CultureInfo("en-US"), 
             DateTimeStyles.None); 
関連する問題