.NET进程如何获取文化信息?

时间:2009-11-16 23:05:10

标签: c# .net datetime

我在Windows Server 2003 R2上运行了一个Windows服务(C#,.NET 2.0)。在一台服务器中,System.Threading.Thread.CurrentThread.CurrentCulture为{en-AU},另一台为{en-US}。 这在DateTime对象上调用ToString()时会产生差异。我希望文化是{en-AU}。

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

.NET运行时如何确定要使用的区域性?任何详细的参考都会有所帮助。

3 个答案:

答案 0 :(得分:8)

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

对于服务,默认情况下没有控制面板设置,例如用户(上述情况),因为它在没有配置文件的LocalSystem帐户下运行,因此它使用操作系统中的系统区域设置。我不确定是否可以通过调整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()以获得正确的输出。

答案 1 :(得分:3)

在我的情况下,只需要一行代码来改变文化:

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

它改变了主线程的默认文化和新线程。

答案 2 :(得分:1)

CultureInfo上的MSDN page有一些可能相关的信息:

  

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

     

如果UseUserOverride为true且指定的区域性与Windows的当前区域性匹配,则CultureInfo将使用这些覆盖,包括DateTimeFormat属性返回的DateTimeFormatInfo实例的属性的用户设置,以及由此返回的NumberFormatInfo实例的属性。 NumberFormat属性。如果用户设置与CultureInfo关联的文化不兼容,例如,如果所选日历不是OptionalCalendars之一,则方法的结果和属性的值是未定义的。

我认为这可能是您调查的良好起点。