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

.NET 8控制台应用中MMM日期格式符显示不一致问题

.NET 8 en-AU文化下MMM日期格式显示不一致问题解决

在.NET 8控制台应用中使用en-AU文化时,会出现日期格式显示矛盾的情况:

  • 单独调用ToString("MMM", culture)时,月份显示为预期的Jun
  • 但在组合格式dd-MMM-yy中调用时,月份却显示为全称June
    而Windows系统本身的en-AU文化下,月份缩写显示正常为Jun。

代码复现

// 设置文化为英语(澳大利亚)
var culture = new CultureInfo("en-AU");

// 指定日期
var currentDate = new DateTime(2024, 6, 8);

// 短日期格式(输出正常)
var formattedDate = currentDate.ToString("d", culture);
Console.WriteLine("Short date in en-AU culture: " + formattedDate); // 输出: 8/06/2024

// 单独显示月份缩写(输出正常)
var abbreviatedMonth = currentDate.ToString("MMM", culture);
Console.WriteLine("Abbreviated month: " + abbreviatedMonth); // 输出: Jun

// 组合格式显示异常
var incorrect = currentDate.ToString("dd-MMM-yy", culture);
Console.WriteLine("Incorrect format: " + incorrect); // 输出: 08-June-24

问题原因

这是因为.NET自带的全球化数据与Windows系统的本地化数据存在差异,en-AU文化下,.NET对组合格式中MMM的解析逻辑,错误调用了较长的月份名称,而单独调用MMM时则使用了正确的缩写。

解决方法

方法1:使用系统原生本地化数据

替换new CultureInfo("en-AU")为CultureInfo.CreateSpecificCulture("en-AU"),该方法会优先加载Windows系统的本地化数据,让.NET的显示与系统保持一致:

var culture = CultureInfo.CreateSpecificCulture("en-AU");
var corrected = currentDate.ToString("dd-MMM-yy", culture);
Console.WriteLine("Corrected format: " + corrected); // 输出: 08-Jun-24

方法2:手动自定义月份缩写

如果不想依赖系统数据,可以直接覆盖DateTimeFormatInfo的月份缩写集合:

var culture = new CultureInfo("en-AU");
// 重新设置缩写月份数组(最后一个空字符串对应闰月)
culture.DateTimeFormat.AbbreviatedMonthNames = new[] 
{ 
    "Jan", "Feb", "Mar", "Apr", "May", "Jun", 
    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "" 
};
var corrected = currentDate.ToString("dd-MMM-yy", culture);
Console.WriteLine("Corrected format: " + corrected); // 输出: 08-Jun-24

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 12:52:22