101

私は Datetime.ParseExact メソッドをいじっていましたが、IFormatProvider が必要です...

null を入力しても機能しますが、正確には何をするのでしょうか?

4

9 に答える 9

65

イアン・ボイドの答えに加えて:

このインターフェースもCultureInfo実装しており、あなたのケースで使用できます。たとえば、フランス語の日付文字列を解析できます。あなたが使用できる

var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
于 2009-02-04T13:13:48.340 に答える
50

IFormatProviderインターフェイスは通常、CultureInfoクラスによって実装されます。たとえば、次のようになります。

  • CultureInfo.CurrentCulture
  • CultureInfo.CurrentUICulture
  • CultureInfo.InvariantCulture
  • CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)

インターフェイスは、カルチャからカルチャ固有のデータのセットを取得する関数のゲートウェイです。クエリを実行できる一般的に利用可能な 2 つのカルチャ オブジェクトIFormatProviderは次のとおりです。

通常は、 にオブジェクト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"));

: すべてのコードはパブリック ドメインにリリースされます。帰属は必要ありません。

于 2013-08-12T19:41:57.147 に答える
18

として 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);
于 2013-01-07T11:26:42.860 に答える
5

IFormatProviderは、問題のメソッドにカルチャ情報を提供します。DateTimeFormatInfoは IFormatProvider を実装し、日付/時刻を表示する形式を指定できます。例は、関連する MSDN ページにあります。

于 2009-02-03T11:09:51.757 に答える
4

ここで見ることができますhttp://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx

そこの備考と例のセクションを参照してください。

于 2009-02-03T10:49:32.967 に答える
2

API については、http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspxを確認してください。

于 2009-02-03T10:49:49.287 に答える
1

DateTimeFormatInfoクラスはこのインターフェイスを実装しているため、DateTime 文字列のフォーマットを制御できます。

于 2009-02-03T10:50:54.960 に答える