.NET6中DateTime.ToString对nl-NL文化月份缩写加圆点问题咨询
问题:.NET 5+ 中荷兰语文化下日期格式化月份缩写带圆点的问题
这段生成发票文件名的C#代码:
var x = new DateTime(2022,8,26); var invoiceNumber = 1100; var fileName = "CustomerX-Invoice"; fileName += $"-{invoiceNumber}"; fileName += $"-{x.ToString("dd-MMM-yyyy", CultureInfo.GetCultureInfo("nl-NL"))}"; Console.WriteLine(fileName);
在.NET Core 3.1中输出为:CustomerX-Invoice-1100-26-aug-2022,但迁移到.NET 5及之后的版本(包括.NET 6)后,荷兰语(nl-NL)文化下的月份缩写会自动添加圆点,输出变成:CustomerX-Invoice-1100-26-aug.-2022。切换为en-US文化时无此异常,不想通过字符串处理强行移除圆点,需要了解原因及最优解决办法。
原因分析
这是设计变更,而非Bug。.NET 5开始全面切换使用Unicode CLDR(通用区域数据仓库)的最新版本作为全球化数据来源,荷兰语的月份缩写在CLDR规范中就是带圆点的格式;旧版本.NET Core(3.1及之前)使用的是旧的NLS(国家语言支持)数据,其中荷兰语月份缩写不带圆点,因此出现了格式差异。
最优解决办法
方案1:自定义日期格式信息(推荐)
基于荷兰语文化创建自定义的DateTimeFormatInfo,手动修改月份缩写为不带圆点的版本,且不会影响全局文化设置:
var x = new DateTime(2022,8,26); var invoiceNumber = 1100; // 获取荷兰语文化并克隆格式信息,避免修改全局实例 var nlCulture = CultureInfo.GetCultureInfo("nl-NL"); var customDateFormat = (DateTimeFormatInfo)nlCulture.DateTimeFormat.Clone(); // 替换带圆点的月份缩写为不带圆点的版本 customDateFormat.AbbreviatedMonthNames = new[] { "jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec", "" }; // 同步修改所有格形式的月份缩写,避免其他场景出现不一致 customDateFormat.AbbreviatedMonthGenitiveNames = customDateFormat.AbbreviatedMonthNames; // 使用自定义格式器生成文件名 var fileName = $"CustomerX-Invoice-{invoiceNumber}-{x.ToString("dd-MMM-yyyy", customDateFormat)}"; Console.WriteLine(fileName);
方案2:回退到旧版NLS数据(不推荐)
如果必须保持和.NET Core 3.1完全一致的区域数据行为,可以在项目的.csproj文件中添加以下配置,强制使用旧的NLS数据而非CLDR:
<PropertyGroup> <UseNls>true</UseNls> </PropertyGroup>
但此方案会影响应用所有全球化相关的处理,且微软未来可能逐步淘汰NLS支持,不建议长期使用。
内容的提问来源于stack exchange,提问作者Stackberg
相关产品推荐
相关产品推荐

