代码之家  ›  专栏  ›  技术社区  ›  andynormancx

.NET的系统区域设置/区域性在哪里设置

  •  8
  • andynormancx  · 技术社区  · 15 年前

    安装在英国服务器上的C程序集(.NET 2.0使用Visual Studio 2005编写)存在问题,应使用英国区域设置。

    我的代码所做的是将格式为dd/mm/yyyy的日期转换为UTC。例如,YYYY-MM-DD。问题出现在日期(如2010年2月16日)中,组件未能转换日期并返回错误。调试之后,我意识到,出于一个奇怪的原因,System.CultureInfo返回的CultureInfo在我们这里。

    我可以使用以下方法编程更改这些设置:

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB", false); 
    

    我的代码运行良好。

    但是我不想一直这样做,因为我的系统应该是英国的。不是美国。 那么,如何将.NET框架的默认区域性更改为默认的en-GB而不是en-US?

    有关信息:

    • 我试图更新machine.config文件,并为全球化部分指定culture=en-gb(它被设置为中性),但它也不起作用[已经为1.1和2.0做了这项工作],但可能我没有正确地更改它。
    • 我已经验证了我的Windows区域设置,它们肯定设置为英国日期为dd/mm/yyyy
    • 我正在虚拟服务器中运行,并且已经验证了我的主机系统。它也设在英国

    编辑:

    关于上下文的一些额外细节。所讨论的程序集是通过COM互操作从本地C++第三方组件调用的,该组件运行为COM+应用程序。

    7 回复  |  直到 15 年前
        1
  •  1
  •   Nikos Steiakakis    15 年前

    您不必更改当前区域性来进行转换。如果您确定日期的格式为“dd/mm/yyyy”,则可以使用

    DateTime dtTemp = DateTime.ParseExact(dateString, "dd/MM/yyyy", null) // in order not to have to specify a FormatProvider
    

    然后使用

    dtTemp.ToString("yyyy-MM-dd")
    

    这样,无论当前的文化是什么,您都不会有问题。但是,如果您不确定日期的格式是“dd/mm/yyyy”,而是基于当前区域性短日期格式,则应使用

    DateTime dtTemp = DateTime(dateString, CurrentCulture.DateTimeFormat.ShortDatePattern, CurrentCulture.DateTimeFormat);
    
        2
  •  5
  •   Hans Passant    15 年前

    服务器配置不正确。控制面板+区域和语言,位置选项卡。改变这个可能有点棘手。服务器可能是故意错误配置的。在执行任何操作之前,请先与服务器管理员联系。

    您的回退计划是使用采用iformatProvider参数的datetime.typarse()方法重载。传递cultureinfo.getcultureinfo(“en-gb”).datetimeformat。

        3
  •  3
  •   Clinton    15 年前

    嗯,根据 API Docs :

    当线程启动时,其区域性最初是通过使用 GetUserDefaultLCID 来自Windows API。

    这个方法从(顾名思义)用户的默认区域设置中派生出它的区域设置,我假设它在控制面板中。 注释 :这与UI区域设置不同。

        4
  •  3
  •   marc    15 年前

    谢谢你的回答(安迪代表我发表了这个问题)。这确实是区域设置的问题,但无论是与我所连接的用户,还是与运行进程的用户,都没有。那太容易了。看起来默认用户仍然在我们这里。我通过单击“高级”选项卡中的复选框“将设置应用于当前用户和默认用户…”并重新启动服务器进行了重置。system.globalization.cultureinfo现在返回en GB。不管日期是以dd/mm/yyyy或dd-mm-yyyy或yyyy-mm-dd传递,而不需要解析,mydate.toString(yyyy-mm-dd)都可以正常工作。

    不过,非常感谢你们的建议(parseexact等)确实有效。它们对其他日期格式非常有用,而我无法以一种好的方式处理这些格式(YYYYMMDD)。

    马克

        5
  •  2
  •   garpunkal    15 年前

    要设置所有页面的UI区域性和区域性,请将全球化部分添加到web.config文件,然后设置ui culture和区域性属性,如下例所示:

    <globalization uiCulture="en" culture="en-GB" />

        6
  •  2
  •   BlueMonkMN    15 年前

    我相信这是由System.Globalization.CultureInfo.InstalledCulture表示的,因此如果没有其他内容,您可以将其复制到线程的当前文化中。我很惊讶您发现了一个线程区域性与已安装区域性不同的情况。也许您的代码运行在一个改变了文化的进程中?

    运行代码的帐户可能具有与系统默认设置不同的区域设置。你查过了吗?

        7
  •  0
  •   shahkalpesh    15 年前

    .NET框架中的程序集与区域性无关。

    您试图转换日期的代码是什么? 如果您正在使用 Parse TryParse ,尝试为其提供区域性参数以了解日期。