.NET Framework 4.8与.NET 8日期格式化月份缩写行为差异咨询
.NET Framework 4.8与.NET 5+日期格式化行为差异解析
以下C#代码在.NET Framework 4.8和.NET 5/6/7/8中运行时,日期格式化行为存在差异:当格式字符串包含日、月、年组合时,June、July、September的缩写在.NET 5+中变为4个字符(June、July、Sept),而单独格式化月份时两个框架的行为一致。
测试代码
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
问题解答
1. 该差异是否为预期设计?
是预期设计。.NET 5及后续版本替换了全球化实现,默认采用ICU(International Components for Unicode)库,替代了.NET Framework依赖的Windows NLS(National Language Support)。ICU遵循Unicode CLDR(Common Locale Data Repository)标准,在en-AU区域设置下,当月份缩写出现在包含日和年的完整日期格式中时,会使用CLDR定义的长缩写形式(June、July、Sept),而单独显示月份时仍使用短缩写,这是符合规范的预期行为。
2. 如何实现.NET 4.8与.NET 8之间的行为一致性?
可以通过两种方向实现对齐:
方向一:让.NET 8行为对齐.NET Framework 4.8
在.NET 8中切换回Windows NLS提供程序:
- 配置文件方式:在
app.config或web.config中添加配置:<configuration> <runtime> <AppContextSwitchOverrides value="System.Globalization.UseNls=true" /> </runtime> </configuration> - 代码方式:在应用启动阶段(全球化操作前)执行:
AppContext.SetSwitch("System.Globalization.UseNls", true);
方向二:让.NET Framework 4.8行为对齐.NET 8
在.NET Framework 4.7.2及以上版本中,可通过安装ICU包启用对应行为:
- 安装NuGet包:
Install-Package System.Globalization.ICU - 在应用启动时初始化ICU:
注:需确保目标系统具备ICU库支持。ICU.Globalization.InitICU();
内容的提问来源于stack exchange,提问作者Ciaran O'Neill
相关产品推荐
相关产品推荐

