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

相对于按名称或LCID使用GetCultureInfo,CultureInfogetCultureInfos为特定区域性返回不同的DateTimeSetting

  •  2
  • Peter  · 技术社区  · 6 年前

    首先,我编辑我的区域设置并更改区域设置的日期格式 nl-BE 使用 yyyy-MM-dd . enter image description here

    然后在我的ASP.NET代码(Windows 10计算机上的标准.NET 4.6.1)中运行以下代码:

    CultureInfo.GetCultures(CultureTypes.InstalledWin32Cultures)
    

    其结果是一个包含区域性的列表。当我特别查看我更改的区域设置(nl BE)时,会得到以下结果:

    getcultures returns the modified locale settings

    这与我在windows设置中指定的相同,如上图所示,看起来很好。

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

    enter image description here

    有人能给我解释一下为什么两者有区别吗?

    也许还有另一个键可以用来确保我得到相同的结果吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   pfx    6 年前

    的构造函数 CultureInfo 类有一个 Boolean 论点 useUserOverride 它指定是否应用为用户配置文件设置的(区域)设置 (去 HKEY_CURRENT_USER\Control Panel\International 在注册表中) .

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

    使用用户覆盖 :
    表示是使用用户选择的区域性设置(true)还是使用默认区域性设置(false)的布尔值。


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

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

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


    GetCultureInfo(int culture) 实例化 文化信息 (使用 GetCurrentInfoHelper )通过 false userUserOverride :

    retval = new CultureInfo(lcid, false);
    

    这将导致返回 文化信息 没有你的改变。