10

IFormatProvider にオーバーロードがあるのはなぜDateTime.ParseExactですか?

解析方法 (スペース、セパレーターなど) を正確に定義している場合、問題はありません。

これら 3 つの例はすべて同じ結果を示しています。

例 1

CultureInfo provider =CultureInfo.CreateSpecificCulture("en-US");
var t=  DateTime.ParseExact("13-2-2013", "d-M-yyyy", provider, DateTimeStyles.None);  
Console.WriteLine (t); //13/02/2013 00:00:00

例 2

  CultureInfo provider =CultureInfo.CreateSpecificCulture("en-US");
  var t=    DateTime.ParseExact("13/2/2013", "d/M/yyyy", provider, DateTimeStyles.None);  
  Console.WriteLine (t); //13/02/2013 00:00:00

例 3

 CultureInfo provider =CultureInfo.CreateSpecificCulture("en-US");
var t=  DateTime.ParseExact("13@@@2@@@2013", "d@@@M@@@yyyy", provider, DateTimeStyles.None);  
 Console.WriteLine (t); //13/02/2013 00:00:00

では、構造を明示的に定義している場合、なぜプロバイダーを提供する必要があるのでしょうか?

4

3 に答える 3

1

私は主に、クライアントがサーバーに情報を送信する Web アプリケーションとおそらくフォームを想像できます。このフォームには日付ピッカーも含まれており、特定のカルチャに基づいて選択された日付を送信します。したがって、米国で使用されている Web サイトの場合、彼らは 13/2/2013 を送信しますが、ドイツからは 13.2.2013 を取得します。では、サーバー側のコードで日付をどのように処理するのでしょうか?

ASP.NET MVC で次のようなものを使用できます (Sergey のおかげで、現在の訪問者から CultureInfo を取得し、それに基づいてリソースを設定しますか? ):

var userLanguages = Request.UserLanguages;
CultureInfo ci;
if (userLanguages.Count > 0)
{
    try
    {
        ci = new CultureInfo(userlanguages[0]);
    }
    catch(CultureNotFoundException)
    {
         ci = CultureInfo.InvariantCulture;
    }
}
else
{
    ci = CultureInfo.InvariantCulture;
}

そして、datetime に解析します。

var t = DateTime.ParseExact(formDateString, "d/M/yyyy", ci, DateTimeStyles.None);  
于 2013-02-17T07:56:20.823 に答える