TwoDigitYearMax 默认值为 2049
日历类(例如 GregorianCalendar)具有 TwoDigitYearMax
属性,该属性定义 100 年范围内的最后一年,它可以用两位数的年份来表示。 此属性通常用于将两位数的年份转换为四位数的年份。 以前,GregorianCalendar 和其他类似公历的日历(例如 JulianCalendar 和 EastAsianLunisolarCalendar)的 Calendar.TwoDigitYearMax 默认为 2029。 该值意味着从 00 到 29 的两位数年份转换为 2000-2029。 从 30 到 99 的两位数年份转换为 1930-1999。 GregorianCalendar 和其他类似公历的默认 TwoDigitYearMax
属性值现已从 2029 更改为 2049。 新值意味着从 00 到 49 的两位数年份被转换为 2000-2049。 从 50 到 99 的任何年份都将转换为 1950-1999。
此外,在 Windows 上,TwoDigitYearMax
属性的默认值现在是从相应的 Windows 设置中获取的(现在的默认值也是 2049)。 这与 .NET 5 之前的行为相匹配。
日期分析是受此更改影响最大的功能。
旧行为
在 .NET 6 和 .NET 7 中,如果没有为 TwoDigitYearMax 指定值,则使用公历分析“12/10/35”等字符串会生成日期“1935 年 12 月 10 日”。
新行为
从 .NET 8 开始,使用公历分析“12/10/35”等字符串会生成日期“2035 年 12 月 10 日”。
引入的版本
.NET 8 预览版 1
中断性变更的类型
此更改为行为更改。
更改原因
更符合逻辑的做法是,分析一个两位数的年份,该年份相对接近两位数的当前年份,以生成一个本世纪(而不是上一个世纪)的四位数年份。 Windows 操作系统也会将其默认设置更改为相同的数字 (2049)。
建议的操作
如果不希望应用在将字符串分析为日期时依赖默认值,可以通过设置 TwoDigitYearMax 属性来控制如何将两位数年份转换为四位数年份。 以下代码显示如何为固定区域性设置该属性。
CultureInfo clonedInvariantCulture = (CultureInfo)(CultureInfo.InvariantCulture.Clone());
clonedInvariantCulture.DateTimeFormat.Calendar.TwoDigitYearMax = 2039; // Use any desired cutoff value.
DateTime dt = DateTime.Parse("12/25/45", clonedInvariantCulture);
受影响的 API
- System.DateOnly.Parse
- System.DateOnly.ParseExact
- System.DateOnly.TryParse
- System.DateOnly.TryParseExact
- System.DateTime.Parse
- System.DateTime.ParseExact
- System.DateTime.TryParse
- System.DateTime.TryParseExact
- System.DateTimeOffset.Parse
- System.DateTimeOffset.ParseExact
- System.DateTimeOffset.TryParse
- System.DateTimeOffset.TryParseExact
- System.Globalization.GregorianCalendar.TwoDigitYearMax(和其他类似公历的日历类型)
- System.Globalization.GregorianCalendar.ToDateTime(和其他类似公历的日历类型)
- System.Globalization.GregorianCalendar.ToFourDigitYear(Int32)(和其他类似公历的日历类型)