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

标签 c# .net datetime

我有一个 Windows 服务在 Windows Server 2003 R2 上运行(C#,.NET 2.0)。在一个服务器中,System.Threading.Thread.CurrentThread.CurrentCulture 是 {en-AU},在另一个服务器中是 {en-US}。 这导致在 DateTime 上调用 ToString() 时出现差异目的。我希望文化成为{en-AU}。

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

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

最佳答案

如果尚未在线程上设置区域性,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() 以获得正确的输出。

关于c# - .NET 进程如何获取文化信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1745439/

相关文章:

c# - 从列表 C# 的列表中获取内部列表

C# 线程同步监视器 + ResetEvent

.net - WPF 图像 UriSource、数据绑定(bind)和缓存

c# - .NET 中的 CloudQueueClient 和 QueueClient 类有什么区别?

php - 无法设置日期时间

c# - 在尝试 Process.Start() 之前,如何以编程方式检查文件是否存在文件关联?

c# - 首先在 Entity Framework 代码中与中间对象进行多对多映射

PostgreSQL - 如何在不同时区呈现日期?

xml - XSLT 1.0 获取当前日期时间

c# - 无法访问 GridViewRowEventArgs 事件处理程序