私は Datetime.ParseExact メソッドをいじっていましたが、IFormatProvider が必要です...
null を入力しても機能しますが、正確には何をするのでしょうか?
私は Datetime.ParseExact メソッドをいじっていましたが、IFormatProvider が必要です...
null を入力しても機能しますが、正確には何をするのでしょうか?
イアン・ボイドの答えに加えて:
このインターフェースもCultureInfo
実装しており、あなたのケースで使用できます。たとえば、フランス語の日付文字列を解析できます。あなたが使用できる
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
IFormatProvider
インターフェイスは通常、CultureInfo
クラスによって実装されます。たとえば、次のようになります。
CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
インターフェイスは、カルチャからカルチャ固有のデータのセットを取得する関数のゲートウェイです。クエリを実行できる一般的に利用可能な 2 つのカルチャ オブジェクトIFormatProvider
は次のとおりです。
DateTimeFormatInfo
:IFormatProvider.GetFormat(typeof(DateTimeFormatInfo));
NumberFormatInfo
: IFormatProvider.GetFormat(typeof(NumberFormatInfo));
通常は、 にオブジェクトIFormatProvider
を渡すように依頼します。DateTimeFormatInfo
DateTimeFormatInfo? format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
から派生したクラス、またはIFormatProvider
から派生したクラスによってインターフェイスが実装されている可能性が高いという内部知識もあるため、インターフェイスを直接キャストできます。CultureInfo
DateTimeFormatInfo
CultureInfo? info = provider as CultureInfo;
if (info != null)
format = info.DateTimeInfo;
else
{
DateTimeFormatInfo? dtfi = provider as DateTimeFormatInfo;
if (dtfi != null)
format = dtfi;
else
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
}
if (format != null)
DoStuffWithDatesOrTimes(format);
その大変な作業はすべて、すでにあなたのために書かれています:
から を取得するDateTimeFormatInfo
にはIFormatProvider
:
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
から を取得するNumberFormatInfo
にはIFormatProvider
:
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
の長所はIFormatProvider
、独自のカルチャ オブジェクトを作成できることです。を実装しIFormatProvider
、要求されたオブジェクトを返す限り、組み込みのカルチャをバイパスできます。
IFormatProvider
を介して、任意のカルチャ オブジェクトを渡す方法としても使用できますIFormatProvider
。たとえば、さまざまな文化における神の名前
これにより、カスタムLordsNameFormatInfo
クラスを の内部に乗せるIFormatProvider
ことができ、イディオムを保持できます。
GetFormat
実際には、自分のメソッドを呼び出す必要はありませんIFormatProvider
。
必要なときはいつでも、オブジェクトIFormatProvider
を渡すことができます:CultureInfo
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
注: すべてのコードはパブリック ドメインにリリースされます。帰属は必要ありません。
として null を渡すIFormatProvider
ことは、これを行う正しい方法ではありません。ユーザーが PC でカスタムの日付/時刻形式を使用している場合、解析と文字列への変換で問題が発生します。文字列に変換するときに誰かが IFormatProvider として null を渡したというバグを修正しました。
代わりに使用する必要がありますCultureInfo.InvariantCulture
違う:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);
正しい:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);
IFormatProviderは、問題のメソッドにカルチャ情報を提供します。DateTimeFormatInfoは IFormatProvider を実装し、日付/時刻を表示する形式を指定できます。例は、関連する MSDN ページにあります。
ここで見ることができますhttp://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx
そこの備考と例のセクションを参照してください。
API については、http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspxを確認してください。
DateTimeFormatInfoクラスはこのインターフェイスを実装しているため、DateTime 文字列のフォーマットを制御できます。