使用DateTime.ToString(“tt”)时,Windows 10中的时间输出(AM / PM)发生了变化

我最近升级到Windows 10 – 我现在看到使用“tt”格式说明符时日期输出中出现了一些意外的变化。

以下是一些演示此问题的代码:

using System.IO; using System; using System.Globalization; using System.Threading.Tasks; class Program { static void Main() { var cultures = new string[] {null, "en-NZ", "en-US", "en-AU", "en-GB"}; foreach (var culture in cultures) { if (culture != null) { var c = CultureInfo.GetCultureInfo(culture); System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture = c; } DateTime dt = new DateTime(2015, 1, 2, 3, 4, 5, DateTimeKind.Utc); Console.WriteLine("selection: {0} CurrentThread.CurrentCulture.Name: {1} CurrentThread.CurrentUICulture.Name: {2} Value: {3}", culture ?? "ambient", System.Threading.Thread.CurrentThread.CurrentCulture.Name, System.Threading.Thread.CurrentThread.CurrentUICulture.Name, dt.ToString("hhh:mm tt")); } } } 

以前版本的Windows中的输出是:

 selection: ambient CurrentThread.CurrentCulture.Name: en-NZ CurrentThread.CurrentUICulture.Name: en-NZ Value: 03:04 am selection: en-NZ CurrentThread.CurrentCulture.Name: en-NZ CurrentThread.CurrentUICulture.Name: en-NZ Value: 03:04 am selection: en-US CurrentThread.CurrentCulture.Name: en-US CurrentThread.CurrentUICulture.Name: en-US Value: 03:04 AM selection: en-AU CurrentThread.CurrentCulture.Name: en-AU CurrentThread.CurrentUICulture.Name: en-AU Value: 03:04 AM selection: en-GB CurrentThread.CurrentCulture.Name: en-GB CurrentThread.CurrentUICulture.Name: en-GB Value: 03:04 am 

在Windows 10中:

 selection: ambient (windows 10) CurrentThread.CurrentCulture.Name: en-NZ CurrentThread.CurrentUICulture.Name: en-US Value: 03:04 am selection: en-NZ CurrentThread.CurrentCulture.Name: en-NZ CurrentThread.CurrentUICulture.Name: en-NZ Value: 03:04 AM selection: en-US CurrentThread.CurrentCulture.Name: en-US CurrentThread.CurrentUICulture.Name: en-US Value: 03:04 AM selection: en-AU CurrentThread.CurrentCulture.Name: en-AU CurrentThread.CurrentUICulture.Name: en-AU Value: 03:04 AM selection: en-GB CurrentThread.CurrentCulture.Name: en-GB CurrentThread.CurrentUICulture.Name: en-GB Value: 03:04 AM 

在这两种情况下,此代码都是针对.Net Framework 4.5的Visual Studio 2013编译获胜

有谁知道为什么行为发生了变化 – 为什么在Windows 10中出现设置任何文化的线程专门改变AM / PM的输出格式为“AM”/“PM”而不是通常输出的文化?

你可能想看看“文化数据不应该被认为是稳定的” http://blogs.msdn.com/b/shawnste/archive/2005/04/05/405694.aspx

有一点是我们开始利用CLDR(公共区域设置数据存储库, http://cldr.unicode.org )来处理许多区域设置,以更好地符合行业标准。 您可能已经注意到我们现在有很多其他语言环境可供使用。

当使用ToString()函数将DateTime更改为字符串时,我总是强制使用ToString("G") 。 然后我再没有问题将字符串解析为DateTime。 我在Windows 7/8/10上使用我的客户端应用程序(以“G”格式获取XML格式的日期和时间并将其解析为DateTime)进行了测试。

我还发现’en-nz’和Windows 10升级的组合突然改变am/pmAM/PM

不同的是我用am/pm保持中继ToShortTimeString()输出的代码但是在Windows 10中它改为AM/PM而不是我花了很多年时间试图找到正确的文化信息/格式字符串,我也试图找到与我原来的Windows 7机器相比,我的新Windows 10机器上缺少本地设置。 但事实certificate,不同版本的Windows机器上的相同本地设置确实显示am/pm AM/PM不同。

在我的Windows 10机器上设置 AM符号现在改为AM 相比之下,在Windows 7机器上进行设置 对于相同的Windows显示语言,AM符号是a.m. 与Windows 2012相同的设置相比较,确认到目前为止只有Windows 10不同

同时确认’en-nz’的DateTimeFormatInfo.AMDesignator现在输出’AM’而不是’am’