我在使用安装在英国服务器上的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?
有关信息:
修改
关于上下文的一些额外细节。有问题的程序集是通过COM interop从作为COM +应用程序运行的本机C ++第三方组件调用的。
答案 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框架中的程序集是文化中立的。
您尝试转换日期的代码是什么?
如果您使用的是 Parse
或TryParse
,请尝试为其提供文化参数以了解日期。