系统区域设置/文化设置在哪里.Net

时间:2010-02-18 12:02:12

标签: c# .net locale

我在使用安装在英国服务器上的c#程序集(使用Visual Studio 2005编写的.net 2.0)时遇到问题,应该使用英国区域设置。

我的代码所做的是将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文件,并为全球化部分指定了culture = en-GB(它设置为中性),但它不起作用[已经为1.1和2.0做了]但是它可能我没有正确改变它。
  • 我已经验证了我的Windows区域设置,它们肯定已设置为英国,日期为dd / MM / yyyy
  • 我在虚拟服务器上运行并验证了我的主机系统。它也被设置为英国

修改

关于上下文的一些额外细节。有问题的程序集是通过COM interop从作为COM +应用程序运行的本机C ++第三方组件调用的。

7 个答案:

答案 0 :(得分:5)

未正确配置服务器。控制面板+区域和语言,位置选项卡。改变这可能有点棘手。服务器可能故意错误配置。在做任何事之前先与服务器管理员联系。

您的后备计划是使用带有IFormatProvider参数的DateTime.TryParse()方法重载。传递CultureInfo.GetCultureInfo(“en-gb”)。DateTimeFormat。

答案 1 :(得分:3)

嗯,根据API Docs

  

当线程启动时,最初使用Windows API中的GetUserDefaultLCID来确定其文化。

此方法从(顾名思义)用户的默认区域设置派生它的区域设置,我假设它位于控制面板中。 注意:这与UI区域设置不同。

答案 2 :(得分:3)

感谢您的回答(我代表我发布了问题)。这确实是区域设置的一个问题,但既不是我所连接的用户,也不是该进程正在运行的用户。那太简单了。看起来默认用户仍然是en-US。我通过单击高级选项卡中的“将设置应用于当前用户和默认用户...”复选框并重新启动服务器来重置。 System.Globalization.CultureInfo现在返回{en-GB}。无论日期是以dd / MM / yyyy还是dd-MM-yyyy或yyyy-MM-dd传递而不需要解析,MyDate.ToString(yyyy-mm-dd)都能正常工作。

但是非常感谢你们的建议(ParseExact等)确实有效。它们对我无法以一种很好的方式处理的其他日期格式非常有帮助(yyyyMMdd)。

马克

答案 3 :(得分:2)

我相信这是由System.Globalization.CultureInfo.InstalledUICulture表示的,所以如果没有别的可能你可以将它复制到线程的当前文化中。我很惊讶您发现线程文化与已安装的文化不同的情况。也许您的代码正在一个改变文化的过程中运行?

运行代码的帐户可能具有与系统默认设置不同的区域设置。你检查过了吗?

答案 4 :(得分:2)

要为所有页面设置UI文化和文化,请将全球化部分添加到Web.config文件,然后设置uiculture和culture属性,如以下示例所示:

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

答案 5 :(得分: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);

答案 6 :(得分:0)

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

您尝试转换日期的代码是什么? 如果您使用的是ParseTryParse,请尝试为其提供文化参数以了解日期。