2012-06-15 103 views
1

我試圖解析與給定的格式的日期,我發現這裏面我也無法解釋:爲什麼DateTime.ParseExact會因CultureInfo.CurrentCulture失敗?

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,不能用文化名稱創建一個新的實例但不會因使用GetCultureInfo()獲得的Culture而失敗。當前的文化是en-US,Windows配置了這兩個更改(在intl.cpl中完成):使用Metric系統和短日期格式「dd-MMM-yyyy」。

更新:

原來的問題是回答正確,但我想補充一點,兩種文化都能夠解析日期。問題似乎在於CultureInfo.DateTimeFormat.DateSeparator中指定的日期分隔符。

具有我的覆寫的cultureInfo具有' - '作爲分隔符,而原始文化具有'/'。

爲了使ParseExact解析日期而不管培養指定的分隔的,格式規範應從「DD/MM/YY」改爲「DD '/' MM '/' YY」

+0

現在的文化是什麼文化? – Oded

+1

這有點吵 - 你能簡化代碼示例(去除成功的測試),以便有一條導致失敗測試的路徑嗎? – 48klocs

+0

直到並且除非你的文化是「GB」左右,否則它不會工作,我猜。 – Praveen

回答

3

從MSDN爲CultureInfo.GetCultureInfo(string)

如果名稱是當前區域性的名稱,返回的CultureInfo對象並不反映任何用戶覆蓋。

的MSDN爲CultureInfo(string)

如果與名字相關聯的文化標識當前的Windows文化的文化標識相匹配,此構造方法創建一個使用這些替代CultureInfo對象。

這意味着靜態GetCultureInfo(string)不會使用用戶重寫的任何設置,而構造函數版本將會使用。

+0

這就解釋了行爲上的差異。我會調查哪些是造成問題的變化。 –

相關問題