57

指定された形式を使用して正確な日時を解析するParseExactメソッドを使用している場合、なぜ IFormatProvider オブジェクトを提供する必要があるのでしょうか? その背後にあるポイントは何ですか?

例えば:

DateTime.ParseExact(dateString, format, provider);

なぜproviderここが必要なのですか?

4

1 に答える 1

68

IFormatProvider オブジェクトを提供する必要があるのはなぜですか? その背後にあるポイントは何ですか?

これにより、カルチャ固有のオプションが可能になります。特に:

  • 使用する形式は、標準の日付/時刻形式である可能性があります。これは、文化によってパターンが異なることを意味します。
  • :パターンでorを使用でき/ます。これは、それぞれ時間区切りまたは日付区切りのカルチャ固有の文字を意味します
  • 月と日の名前を解析するとき、それらは明らかに文化に依存します
  • カルチャによってデフォルトのカレンダーも決定され、結果に影響します

最後のポイントの例として、米国またはサウジアラビアのカルチャで解釈されたまったく同じ文字列と形式を考えてみましょう。

using System;
using System.Globalization;

class Test
{
    static void Main()        
    {
        CultureInfo us = new CultureInfo("en-US");
        CultureInfo sa = new CultureInfo("ar-SA");
        string text = "1434-09-23T15:16";
        string format = "yyyy'-'MM'-'dd'T'HH':'mm";
        Console.WriteLine(DateTime.ParseExact(text, format, us));
        Console.WriteLine(DateTime.ParseExact(text, format, sa));
    }
} 

米国のカルチャで解析する場合は、グレゴリオ暦が使用されますが、サウジアラビアのカルチャで解析する場合は、Um Al Qura カレンダーが使用されます。ここで、1434 は現在の年です (この回答を書いているとき)。

于 2013-09-23T14:15:59.977 に答える