回答:
イアン・ボイドの答えに加えて:
また、CultureInfo
このインターフェースを実装し、あなたのケースで使用することができます。たとえば、フランスの日付文字列を解析できます。あなたは使うことができます
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
DateTime.ParseExact(string, string, IFormatProvider)
代わりに使用する必要があります。つまり、 DateTime.ParseExact("20160409 111559","yyyyMMdd HHmmss",CultureInfo.CurrentCulture)
DateTime dt = DateTime.Parse(yourDateInputString, ci);
ます。回答を修正してください。
IFormatProvider
インタフェースは、通常であなたのために実装されCultureInfo
たクラス、例えば:
CultureInfo.CurrentCulture
CultureInfo.CurrentUICulture
CultureInfo.InvariantCulture
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
このインターフェースは、カルチャーから一連のカルチャー固有のデータを取得する関数のゲートウェイです。IFormatProvider
クエリを実行できる2つの一般的に利用可能なカルチャオブジェクトは次のとおりです。
それが通常動作する方法は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);
CultureInfo.InvariantCulture
代わりに使用する理由はありますCultureInfo.CurrentCulture
か?
null
デフォルトでになりますCultureInfo.CurrentCulture
。参照ソースの呼び出しを参照してください。呼び出しのチェーンをたどると、最終的にnull DateTimeFormatInfo.CurrentInfo
は、CultureInfo.CurrentCulture
出力と同等に置き換えられます。
IFormatProviderは、問題のメソッドにカルチャ情報を提供します。DateTimeFormatInfoはIFormatProviderを実装し、日付/時刻を表示する形式を指定できます。例は関連するMSDNページにあります。
あなたはここhttp://msdn.microsoft.com/en-us/library/system.iformatprovider.aspxを見ることができます
そこにある備考と例のセクションを参照してください。
IFormatProvider
はを使用していませんIFormatProvider
。
.NET Frameworkには、数値と日付と時刻の値のフォーマットまたは解析に使用されるカルチャ固有の情報を提供するために、次の3つの定義済みIFormatProvider実装が含まれています。
NumberFormatInfo
特定の培養のためにそのような通貨としてフォーマット番号や、数千の分離、および小数点区切り記号に使用される情報を提供するクラス。NumberFormatInfo
オブジェクトによって認識され、数値のフォーマット操作で使用される定義済みのフォーマット文字列については、「標準の数値フォーマット文字列」および「カスタム数値フォーマット文字列」を参照してください。DateTimeFormatInfo
クラスは、特定のカルチャの日付と時刻の区切り記号や、日付の年、月、日のコンポーネントの順序と形式など、日付と時刻の形式に使用される情報を提供します。DateTimeFormatInfo
オブジェクトによって認識され、数値のフォーマット操作で使用される定義済みのフォーマット文字列については、「標準の日付と時間のフォーマット文字列」と「カスタムの日付と時間のフォーマット文字列」を参照してください。CultureInfo
特定の文化を表すクラス、。そのGetFormat
メソッドは、数値または日付と時刻を含むフォーマットまたは解析操作でオブジェクトが使用されているかどうかに応じて、カルチャ固有NumberFormatInfo
またはDateTimeFormatInfo
オブジェクトを返しますCultureInfo
。.NET Frameworkは、カスタムフォーマットもサポートしています。これには通常、IFormatProviderとICustomFormatterの両方を実装するフォーマットクラスの作成が含まれます。次に、このクラスのインスタンスは、などのカスタム書式設定操作を実行するメソッドにパラメータとして渡されますString.Format(IFormatProvider, String, Object[])
。
DateTimeFormatInfoクラスが実装このインタフェースは、それはあなたがあなたのDateTime列の書式を制御することができます。