我正在我当前的项目中做一些全球化工作,我遇到了一个奇怪的行为。我在Windows 7上运行,只安装了英语 - 美国,我的应用程序在.NET 3.5上运行。
给出以下代码段:
var culture = new CultureInfo("zh-CN", true);
var formats = culture.GetAllDateTimePatterns('D');
在.NET 4下,返回以下格式:
yyyy'年'M'月'd'日'
yyyy'年'M'月'd'日',dddd
dddd,yyyy'年'M'月'd'日'
“控制面板”中的“日期和时间格式”对话框显示的内容(我的目标是什么)。
但是在.NET 3.5(及更早版本)中会返回以下内容:
yyyy'年'M'月'd'日'
yyyy-MM-dd
dddd, yyyy-MM-dd
dddd, yyyy'年'M'月'd'日'
我去了,检查了使用EnumDateFormatsExEx(和早期版本)返回的值,它与.NET 4的结果相匹配。
这种差异并没有打扰我;我的问题是为什么结果会有所不同?我认为底层实现是在呼叫EnumDateFormatsExEx
或类似的,但在我解雇了Ilspy后,我没有看到任何类似的东西。我想显示控制面板中显示的相同列表,所以当格式不同时我感到很惊讶。我认为格式列表将来自操作系统,并且在运行时版本之间没有区别。
答案 0 :(得分:6)
.NET 4中的相关更改为documented here。高亮:
.NET Framework 4的主要全球化功能之一是能够提供最新信息。此版本将提供的最早的全球化信息是发货时可用的数据,并且仅在Windows 7之前的Windows上运行时。在Windows 7及更高版本上运行时,将直接从操作系统检索全球化信息,意味着客户在升级到新Windows时将获得当前的全球化信息。运行Windows 7及更高版本的客户将看到本机(Win32)和托管(.NET)应用程序的统一全球化体验。
由于世界不断变化,全球化信息随时都可能发生变化;开发人员不应期望全球化属性的值在发行版之间或甚至同一版本的.NET Framework中持续存在。这对于.NET Framework用户来说并不是全新的行为。自.NET Framework 2以来支持的Windows-Only-Cultures的属性在不同版本的Windows上运行时可能具有不同的值