You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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包启用对应行为:

  1. 安装NuGet包:Install-Package System.Globalization.ICU
  2. 在应用启动时初始化ICU:
    ICU.Globalization.InitICU();
    
    注:需确保目标系统具备ICU库支持。

内容的提问来源于stack exchange,提问作者Ciaran O'Neill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:46:24