2009-11-16 30 views
3

我有Windows Server 2003 R2上的Windows服务运行(C#,.NET 2.0)。在一台服务器中,System.Threading.Thread.CurrentThread.CurrentCulture为{en-AU},另一台为{en-US}。 这在调用DateTime对象上的ToString()时导致了差异。我希望文化是{en-AU}。.NET进程如何获取文化信息?

我检查了“区域和语言设置”。在这两台服务器中,“区域选项”选项卡显示“英语(Asutralia)”。但在“高级”选项卡中,其中一个显示“英语(美国)”,另一个显示“英语(澳大利亚)”。所以这一定是造成差异的原因。虽然我想知道为什么“高级”选项卡为什么说“您要使用的非Unicode代码程序的语言版本”,但我认为.NET进程是Unicode,不应该受此影响。

如何.NET运行时确定的文化使用?任何详细的参考将有所帮助。

回答

8

如果文化尚未设置线程,Thread.CurrentThread.CurrentCulture默认为“用户默认文化”上 - 它从底层的操作系统得到。这由区域控制面板小程序中的“格式”部分决定。

对于服务,它具有由缺省像用户(以上的情况下),因为它,这将不具有轮廓的本地系统帐户下运行无控制面板设置,所以它使用系统区域从OS。我不确定是否可以通过调整Windows中的设置为服务设置此功能。

有一些事情可以做:

  1. 可以明确设置在主线程的CurrentCulture服务启动时。如果你这样做,你需要记住在你的服务中创建的任何新线程也需要设置它们的CurrentCulture,因为线程不会从父线程继承它们的文化。

  2. 您可以设置为特定用户运行服务,并设置该用户的区域设置(格式部分)是你要使用的文化。当服务开始使用时,它将使用该用户的区域设置。

  3. 由于您的问题似乎与调用DateTime.ToString(),请确保您通过AU文化的ToString()方法:

    DateTime.ToString(new CultureInfo("en-AU")) 
    

    你可以将其添加为一个扩展方法来保存你做这个无处不在:

    public static string ToAUString(this DateTime dateTime) 
    { 
        return dateTime.ToString(new CultureInfo("en-AU")); 
    } 
    

    然后,您可以拨打DateTime.ToAUString()以获取正确的输出。

+0

在这种情况下,服务(实际上是WCF托管服务)正在特定的服务用户帐户下运行。但我已经在另一台机器上为该服务设置了相同的帐户进行测试,并且它的行为正确。只有在高级选项卡中具有“英语(美国)”的计算机上,该服务的行为才不正确。 – softveda 2009-11-17 02:06:49

+0

我已成功登录为机器中的服务帐户,格式为“英语(美国)”。所以用户配置文件是不正确的。这与高级选项卡无关。感谢您指向正确的方向。 – softveda 2009-11-17 02:22:17

1

MSDN pageCultureInfo有一些信息可能是相关的:

用户可能会选择重写某些与Windows的通过控制面板的区域和语言选项部分当前区域性关联的值。例如,用户可能选择以不同格式显示日期,或使用文化默认值以外的货币。通常,您的应用程序应该遵守这些用户覆盖。

如果UseUserOverride是真实的,指定的区域性当前Windows的区域性匹配,CultureInfo的使用这些覆盖,包括:由DateTimeFormat属性返回的DateTimeFormatInfo实例的属性用户设置和的NumberFormatInfo实例的属性通过返回NumberFormat属性。例如,如果用户设置与CultureInfo关联的区域性不兼容,则如果所选日历不是OptionalCalendars之一,则方法结果和属性值不确定。

我想这可能是你的调查一个很好的起点。

3

在我的情况下,它花了只有一行代码来改变文化:

System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = System.Globalization.CultureInfo.GetCultureInfo("en-US") 

它改变了主线程和新的默认文化也是如此。

+2

注意:这是[仅适用于.NET 4.5](http://msdn.microsoft.com/zh-cn/library/system.globalization.cultureinfo.defaultthreadcurrentuiculture%28v=vs.110%29.aspx)!在此之前,您需要在创建的每个线程上手动设置文化。 – Abel 2014-04-20 18:13:29