2012-02-08 74 views
3

我在当前的项目中正在做一些全球化工作,并且遇到了一个奇怪的行为。我在Windows 7上运行,只安装了英文 - 美国版本,而我的应用程序运行在.NET 3.5上。为什么DateTimeFormatInfo.GetAllDateTimePatterns在不同的.NET版本中返回不同的结果?

考虑下面的代码片段:

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后,我没有看到任何类似的东西。我想要显示出现在控制面板中的相同列表,所以当格式不同时我很惊讶。我认为格式列表将来自操作系统,并且在运行时版本之间没有区别。

回答

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上运行时可能具有不同的值

相关问题