为什么DateTimeFormatInfo.GetAllDateTimePatterns在不同的.NET版本中返回不同的结果?

Com*_*Cow 3 c# globalization cultureinfo

我在当前项目中做了一些全球化工作,我遇到了一个奇怪的行为.我在Windows 7上运行,只安装了英语 - 美国,我的应用程序在.NET 3.5上运行.

给出以下代码段:

var culture = new CultureInfo("zh-CN", true);
var formats = culture.GetAllDateTimePatterns('D');
Run Code Online (Sandbox Code Playgroud)

在.NET 4下,返回以下格式:

    yyyy'?'M'?'d'?'
    yyyy'?'M'?'d'?',dddd 
    dddd,yyyy'?'M'?'d'?'
Run Code Online (Sandbox Code Playgroud)

这是控制面板中的日期和时间格式对话框显示的内容(我的目标).

但是在.NET 3.5(及更早版本)中,返回以下内容:

   yyyy'?'M'?'d'?'
   yyyy-MM-dd
   dddd, yyyy-MM-dd
   dddd, yyyy'?'M'?'d'?'
Run Code Online (Sandbox Code Playgroud)

我去检查了使用EnumDateFormatsExEx(和早期版本)返回了什么值,它与.NET 4的结果相匹配.

差异不会打扰我; 我的问题是为什么结果不同?我认为底层实现是在呼唤EnumDateFormatsExEx或类似,但在我解雇了Ilspy后,我没有看到任何类似的东西.我想显示控制面板中显示的相同列表,所以当格式不同时我感到很惊讶.我认为格式列表将来自操作系统,并且在运行时版本之间没有区别.

Han*_*ant 6

这里记录了.NET 4中的相关更改.高亮:

.NET Framework 4的主要全球化功能之一是能够提供最新信息.此版本将提供的最早的全球化信息是发货时可用的数据,并且仅在Windows 7之前的Windows上运行时.在Windows 7及更高版本上运行时,将直接从操作系统检索全球化信息,意味着客户在升级到新Windows时将获得当前的全球化信息.运行Windows 7及更高版本的客户将看到本机(Win32)和托管(.NET)应用程序的统一全球化体验.

由于世界不断变化,全球化信息随时都可能发生变化; 开发人员不应期望全球化属性的值在发行版之间或甚至同一版本的.NET Framework中持续存在.这对于.NET Framework用户来说并不是全新的行为.自.NET Framework 2以来支持的Windows-Only-Cultures的属性在不同版本的Windows上运行时可能具有不同的值