【问题标题】:How does a .NET process get the culture information?.NET 进程如何获取文化信息?
【发布时间】:2013-07-17 22:39:48
【问题描述】:

我在 Windows Server 2003 R2 上运行了一个 Windows 服务(C#,.NET2.0)。在一台服务器中,System.Threading.Thread.CurrentThread.CurrentCulture 是 {en-AU},而在另一台服务器中是 {en-US}。 这导致在 DateTime 对象上调用 ToString() 时出现差异。我希望文化是 {en-AU}。

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

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

【问题讨论】:

    标签: c# .net datetime


    【解决方案1】:

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

    【讨论】:

    • 在这种情况下,服务(实际上是 WCF 托管服务)在特定的服务用户帐户下运行。但是我在另一台机器上为该服务设置了相同的帐户进行测试,它的行为正确。只有在高级选项卡中有“英语(美国)”的机器上,服务行为不正确。
    • 我已经成功地以机器中的服务帐户登录,格式为“英语(美国)”。所以用户配置文件不正确。它与“高级”选项卡无关。感谢您指出正确的方向。
    【解决方案2】:

    在我的例子中,改变文化只需要一行代码:

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

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

    【讨论】:

    【解决方案3】:

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

    用户可以选择通过控制面板的区域和语言选项部分覆盖与当前 Windows 文化相关的一些值。例如,用户可能会选择以不同的格式显示日期,或者使用不同于文化默认值的货币。一般来说,您的应用程序应该尊重这些用户覆盖。

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

    我认为这可能是您调查的一个很好的起点。

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 2023-03-03
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多