.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
相关产品推荐
相关产品推荐

