2010-02-18 126 views
6

我在使用英國區域設置安裝在英國服務器上的c#程序集(.net 2.0使用Visual Studio 2005編寫)時遇到問題。系統區域設置/文化設置爲.Net

我的代碼的作用是將dd/MM/yyyy格式的日期轉換爲utc。即yyyy-mm-dd。問題出現在日期如16/02/2010組件未能轉換日期並返回錯誤。調試後,我意識到,出於一個奇怪的原因,由System.CultureInfo返回的CultureInfo是en-US。

我可以用編程方式更改這些設置:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB", false); 

和我的代碼工作正常。

但是我不想一直這麼做,因爲我的系統應該是英國的。不是我們。 那麼,如何將.Net框架的默認文化更改爲默認的en-GB而不是en-US?

的信息:

  • 我試圖更新machine.config文件和全球化節指定文化= EN-GB(它被設定爲中性),但它不工作,要麼[有做了1.1和2.0],但可能我沒有正確改變它。
  • 我已驗證我的Windows區域設置,並且他們肯定設置爲英國,日期爲dd/MM/yyyy
  • 我正在虛擬服務器中運行並驗證了我的主機系統。它也被設置爲英國

編輯:

有關上下文的額外細節的位。正在討論的程序集正在通過COM interop從本地C++第三方組件作爲COM +應用程序運行。

+0

如果問題來自C++/COM環境或操作系統,可能很有趣。如果你只是想用一個簡單的控制檯應用程序 Console.WriteLine(Thread.CurrentThread.CurrentCulture.DisplayName); 它顯示了什麼? – HackerBaloo 2010-02-18 12:59:05

回答

1

您不必更改CurrentCulture進行轉換。如果您確定的日期是「DD/MM/YYYY」的形式,你可以使用

DateTime dtTemp = DateTime.ParseExact(dateString, "dd/MM/yyyy", null) // in order not to have to specify a FormatProvider 

然後用

dtTemp.ToString("yyyy-MM-dd") 

這樣,你會不會有問題不管是什麼CurrentCulture是。不過,如果你不能確定的日期格式爲「DD/MM/YYYY」,而這是基於的CurrentCulture短日期格式,那麼你就應該使用

DateTime dtTemp = DateTime(dateString, CurrentCulture.DateTimeFormat.ShortDatePattern, CurrentCulture.DateTimeFormat); 
+0

中遇到問題我喜歡這個問題的實際解決方案並思考它,它可能是最好的方式來實現它作爲輸入/輸出格式確實是固定的。我仍然想知道爲什麼系統區域設置不能正常工作,但我期望的是。 – andynormancx 2010-02-18 13:02:52

+0

我想出了這種解決方法,在系統的選定語言環境要求格式爲「dd/MM/yyyy」但用戶選擇日期格式爲「MM/dd/yyyy」的情況下。所以我不能真正相信當前的文化。這在Windows 7中是可行的,我也在XP中考慮。 – 2010-02-18 13:36:48

2

我相信這是由System.Globalization.CultureInfo.InstalledUICulture表示的,所以如果沒有別的,也許你可以將它複製到線程的當前文化。我很驚訝你發現線程文化與安裝的文化不同的情況。也許你的代碼運行在一個改變文化的過程中?

運行代碼的帳戶有可能具有與系統默認不同的區域設置。你檢查過了嗎?

+0

我不確定第一個建議與明確設定文化有什麼不同。它可能是用戶帳戶設置錯誤,我會檢查。 – andynormancx 2010-02-18 12:18:58

1

要設置UI培養和培養的所有頁面,添加一個全球化部到Web.config文件,然後設置的UICulture和文化屬性,如顯示在下面的例子:

<globalization uiCulture="en" culture="en-GB" />

+0

有問題的代碼沒有在ASP.NET中運行,所以沒有web.config文件,我猜這個設置也可以在應用程序的配置文件中設置。我會爲關於調用上下文的問題添加一些額外的細節。 – andynormancx 2010-02-18 12:12:22

+0

最佳答案imho,如果你有不同文化的系統,它也是一個很好的方法來獲得googlable錯誤消息;加上你早早崩潰了'System.Globalization'相關的錯誤,你可能會在代碼庫 – mfeineis 2014-11-13 17:37:41

3

嗯,根據API Docs

當一個線程啓動時,它的文化最初通過使用Windows API中的GetUserDefaultLCID來確定。

此方法從(顧名思義)派生它的區域設置用戶的默認區域設置,我假設它是在控制面板中。 注意:這不同於UI區域設置。

0

.net框架中的程序集是文化中立的。

你想要轉換日期的代碼是什麼? 如果您使用的是 ParseTryParse,請嘗試提供文化參數以便了解日期。

5

服務器配置不正確。控制面板+區域和語言,位置選項卡。改變這可能有點棘手。服務器可能會故意錯誤配置。在做任何事之前先與服務器管理員交談。

您的回退計劃是使用採用IFormatProvider參數的DateTime.TryParse()方法重載。傳遞CultureInfo.GetCultureInfo(「en-gb」)。DateTimeFormat。

3

感謝您的回答(安迪以我的名義發佈了問題)。這確實是一個區域設置的問題,但是與我連接的用戶和用戶之間的連接都沒有關係。那太容易了。看起來,默認用戶仍然是en-US。我通過單擊高級選項卡中的「將設置應用於當前用戶和默認用戶...」複選框並重新啓動服務器進行了重置。 System.Globalization.CultureInfo現在返回{en-GB}。並且MyDate.ToString(yyyy-mm-dd)可以正常工作,無論日期是以dd/MM/yyyy還是dd-MM-yyyy還是yyyy-MM-dd的形式傳遞,而無需解析。

但是,非常感謝您的建議(ParseExact等),確實有效。他們對於其他日期格式非常有幫助,我無法以很好的方式處理(yyyyMMdd)。

Marc

+0

關於默認用戶設置的有趣和有價值的觀察 – 2017-06-23 18:17:04