此代码在 .NET Framework 4.8 和 .NET5、6、7、8 之间的行为不同
Console.WriteLine("CurrentCulture is {0}.", CultureInfo.CurrentCulture.Name);
Console.WriteLine("CurrentUICulture is {0}.", CultureInfo.CurrentUICulture.Name);
var date = new DateTime(2020, 1, 15);
for (int i = 0; i < 12; i++)
{
Console.Write("{0} ", date.ToString("MMM"));
Console.WriteLine("{0}", date.ToString("d-MMM-yyyy"));
date = date.AddMonths(1);
}
在 .net Framework 4.8 中,输出是
CurrentCulture is en-AU.
CurrentUICulture is en-US.
Jan 15-Jan-2020
Feb 15-Feb-2020
Mar 15-Mar-2020
Apr 15-Apr-2020
May 15-May-2020
Jun 15-Jun-2020
Jul 15-Jul-2020
Aug 15-Aug-2020
Sep 15-Sep-2020
Oct 15-Oct-2020
Nov 15-Nov-2020
Dec 15-Dec-2020
在 .NET 5、6、7 和 8 中,我得到以下输出:
CurrentCulture is en-AU.
CurrentUICulture is en-US.
Jan 15-Jan-2020
Feb 15-Feb-2020
Mar 15-Mar-2020
Apr 15-Apr-2020
May 15-May-2020
Jun 15-June-2020
Jul 15-July-2020
Aug 15-Aug-2020
Sep 15-Sept-2020
Oct 15-Oct-2020
Nov 15-Nov-2020
Dec 15-Dec-2020
请注意 June 和 July & September 现在如何为我提供 4 个字母的缩写,但前提是日期格式字符串包含日期和年份。当我单独显示月份时,我在 .NET Fx 和 .NET Core 之间得到了相同的行为。
有人知道这是有意的吗?有没有办法在 .NET 4.8 和 .NET 8 之间获得一致的行为?
.NET 5 有一个重大更改 - 全球化 API 在 Windows 10 上使用 ICU 库:
从 .NET 5 开始,如果应用程序在 Windows 10 May 2019 Update 或更高版本上运行,.NET 库默认使用 ICU 全球化 API。
这影响了全球化 API 和文化敏感 API。
如果您切换回 NLS,您应该会得到输出。例如,将以下内容添加到 .csproj:
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" />
</ItemGroup>
我猜名字来自ICU的这一部分
另请参阅: