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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 03:48:36