1

特定の形式で日付を解析しようとしていますが、説明できないことがわかりました:

var date = new DateTime(2001, 01, 10);

var cultureInfo1 = CultureInfo.GetCultureInfo(CultureInfo.CurrentCulture.Name);
var cultureInfo2 = new CultureInfo(CultureInfo.CurrentCulture.Name);

Assert.AreEqual(date, DateTime.ParseExact("10/01/01", "dd/MM/yy", cultureInfo1));

Assert.Throws<FormatException>(() => DateTime.ParseExact("10/01/01", "dd/MM/yy", CultureInfo.CurrentCulture));
Assert.Throws<FormatException>(() => DateTime.ParseExact("10/01/01", "dd/MM/yy", cultureInfo2));

この呼び出しが CurrentCulture では失敗し、Culture 名を使用して作成された新しいインスタンスでは失敗するのに、GetCultureInfo() を使用して取得した Culture では失敗しないのはなぜですか。現在のカルチャは en-US であり、Windows は次の 2 つの変更 (intl.cpl で行われます) で構成されています: メトリック システムと短い日付形式 'dd-MMM-yyyy' を使用します。

アップデート:

元の質問には正しく答えられましたが、両方の文化が日付を解析できることを付け加えたいと思います。問題は、CultureInfo.DateTimeFormat.DateSeparator で指定された日付区切り記号にあるようです。

元のカルチャには「/」が含まれていますが、私のオーバーライドを持つ cultureInfo には区切り記号として「-」があります。

カルチャで指定されたセパレータに関係なく、ParseExact で日付を解析するには、形式仕様を"dd/MM/yy"から"dd'/'MM'/'yy"に変更する必要があります。

4

1 に答える 1

3

MSDN からCultureInfo.GetCultureInfo(string)

name が現在のカルチャの名前である場合、返される CultureInfo オブジェクトにはユーザーのオーバーライドが反映されません。

の MSDNCultureInfo(string)

name に関連付けられたカルチャ識別子が現在の Windows カルチャのカルチャ識別子と一致する場合、このコンストラクターはそれらのオーバーライドを使用する CultureInfo オブジェクトを作成します。

これは、静的GetCultureInfo(string)バージョンはユーザーがオーバーライドした設定を使用しないのに対し、コンストラクター バージョンは使用することを意味します。

于 2012-06-15T20:23:11.480 に答える