私は 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.CurrentCultureCultureInfo.CurrentUICultureCultureInfo.InvariantCultureCultureInfo.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から派生したクラスによってインターフェイスが実装されている可能性が高いという内部知識もあるため、インターフェイスを直接キャストできます。CultureInfoDateTimeFormatInfo
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 文字列のフォーマットを制御できます。