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

sof*_*eda 3 .net c# 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运行时如何确定要使用的文化?任何详细的参考都会有所帮助.

adr*_*nks 8

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

对于服务,它默认没有控制面板设置,如用户(上述情况),因为它在没有配置文件的LocalSystem帐户下运行,因此它使用操作系统中的系统区域设置.我不确定是否可以通过调整Windows中的设置来为服务设置此项.

你可以做一些事情:

  1. 您可以CurrentCulture在服务启动时显式设置主线程.如果这样做,您将需要记住,在您的服务中创建的任何新线程也需要具有它们的CurrentCulture集合,因为线程不会从父线程继承它们的文化.

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

  3. 因为您的问题似乎与调用有关DateTime.ToString(),请确保将AU文化传递给ToString()方法:

    DateTime.ToString(new CultureInfo("en-AU"))
    
    Run Code Online (Sandbox Code Playgroud)

    您可以将其添加为扩展方法,以节省您必须在任何地方执行此操作:

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

    然后,您可以调用DateTime.ToAUString()以获得正确的输出.


小智 5

就我而言,只需要一行代码就可以改变文化:

System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = System.Globalization.CultureInfo.GetCultureInfo( "en-US" )
Run Code Online (Sandbox Code Playgroud)

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

  • 注意:这[仅自 .NET 4.5 起可用](http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.defaultthreadcurrentuiculture%28v=vs.110%29.aspx)!在此之前,您需要在创建的每个线程上手动设置区域性。 (3认同)