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

DateTime.ParseExact解析MMyy格式时,年份≥2030被转为19世纪问题咨询

问题原因及解决方案

这是.NET框架处理两位年份解析的默认行为导致的:

.NET中,当解析两位格式的年份(yy格式符)时,会依赖当前使用的文化(CultureInfo)对应的Calendar.TwoDigitYearMax属性来映射世纪。默认情况下,CultureInfo.InvariantCulture的Gregorian日历将TwoDigitYearMax设为2029,这意味着:

  • 两位年份00-29会被解析为2000-2029
  • 两位年份30-99会被解析为1930-1999

这就是你遇到的0430被解析为1930,而0429正确解析为2029的原因。


解决方法

方法1:修改文化的TwoDigitYearMax属性

通过克隆默认文化并调整其TwoDigitYearMax值,来指定两位年份对应的最大世纪年份:

// 克隆不变文化,避免修改全局默认设置
var customCulture = (CultureInfo)CultureInfo.InvariantCulture.Clone();
// 设置两位年份最大映射到2099,即30-99对应2030-2099
customCulture.DateTimeFormat.Calendar.TwoDigitYearMax = 2099;

// 使用自定义文化解析
var expiry30 = DateTime.ParseExact("0430", "MMyy", customCulture);
// 结果:04/01/2030 00:00:00

方法2:手动解析年份(更灵活)

如果需要自定义两位年份的映射规则,可以直接拆分字符串手动构造DateTime:

string input = "0430";
int month = int.Parse(input.Substring(0, 2));
int twoDigitYear = int.Parse(input.Substring(2, 2));

// 自定义规则:两位年份≥30时对应20xx,否则19xx(可根据需求调整)
int year = twoDigitYear >= 30 ? 2000 + twoDigitYear : 1900 + twoDigitYear;

DateTime expiry = new DateTime(year, month, 1);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:01:43