【问题标题】:CultureInfo.GetCultures returns different DateTimeSettings for specific culture than when using GetCultureInfo by Name or LCIDCultureInfo.GetCultures 为特定文化返回不同的 DateTimeSettings,而不是按名称或 LCID 使用 GetCultureInfo
【发布时间】:2018-07-31 15:08:44
【问题描述】:

首先我编辑我的区域设置并将语言环境nl-BE 的日期格式更改为使用yyyy-MM-dd。

然后在我的 ASP.NET 代码(Windows 10 机器上的标准 .Net 4.6.1)中运行此代码:

CultureInfo.GetCultures(CultureTypes.InstalledWin32Cultures)

这样的结果是一个包含文化的列表。当我专门查看我更改的语言环境(nl-BE)时,我得到以下结果:

这与我在 Windows 设置中指定的相同,如上图所示,看起来不错。

如果我在同一应用程序中按名称或 LCID 搜索此特定区域设置,则不会显示此自定义设置:

有人可以向我解释为什么两者之间存在差异吗?

我是否可以使用另一个键来确保获得相同的结果?

【问题讨论】:

  • 我怀疑 asp.net 没有像你一样运行,它是作为机器帐户运行的
  • @pm100 那么为什么 CultureInfo.GetCultures 在同一进程中运行时返回正确的结果?

标签: .net cultureinfo regional-settings


【解决方案1】:

CultureInfo 类的构造函数有一个Boolean 参数useUserOverride,它指定是否应用您为用户配置文件设置的(区域)设置(转到注册表中的HKEY_CURRENT_USER\Control Panel\International) 。

public CultureInfo(int culture) : this(culture, true) {}

public CultureInfo(int culture, bool useUserOverride) 
{
   // ...
}

useUserOverride:
一个布尔值,表示是使用用户选择的文化设置 (true) 还是默认的文化设置 (false)。


CultureInfo.GetCultures(CultureTypes types)(通过CultureData.GetCultures(CultureTypes types))使用true(通过构造函数默认值)创建实例。

cultures[i] = new CultureInfo(cultureNames[i]);

所以这些文化有你的变化。


GetCultureInfo(int culture) 实例化一个CultureInfo(使用GetCurrentInfoHelper)将false 传递给userUserOverride:

retval = new CultureInfo(lcid, false);

这会导致返回 CultureInfo 而无需您进行更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2017-10-13
    • 2016-01-23
    • 2021-06-08
    • 1970-01-01
    相关资源
    最近更新 更多