O padrão TwoDigitYearMax é 2049
Classes de calendário, como GregorianCalendar, têm uma propriedade TwoDigitYearMax
que define o último ano de um intervalo de 100 anos que pode ser representado por um ano de dois dígitos. Essa propriedade geralmente é usada para traduzir um ano de dois dígitos para um ano de quatro dígitos. Anteriormente, Calendar.TwoDigitYearMax usava como padrão o valor 2029 para GregorianCalendar e outros calendários gregorianos, como JulianCalendar e EastAsianLunisolarCalendar. Esse valor significava que anos de dois dígitos de 00 a 29 eram traduzidos para 2000-2029. Anos de dois dígitos de 30 a 99 eram traduzidos para 1930-1999. O valor da propriedade TwoDigitYearMax
padrão para GregorianCalendar e outros calendários gregorianos agora foi alterado de 2029 para 2049. O novo valor significa que os anos de dois dígitos de 00 a 49 são traduzidos para 2000-2049. Qualquer ano de 50 a 99 será traduzido para 1950-1999.
Além disso, no Windows, o valor padrão da propriedade TwoDigitYearMax
agora é obtido da configuração do Windows correspondente (cujo valor padrão agora também é 2049). Isso corresponde ao comportamento anterior ao .NET 5.
A análise de datas é a funcionalidade mais afetada por essa alteração.
Comportamento anterior
No .NET 6 e no .NET 7, se você não especificasse um valor para TwoDigitYearMax, a análise de uma cadeia de caracteres como "12/10/35" com o calendário gregoriano produzia a data "10 de dezembro de 1935".
Novo comportamento
Começando no .NET 8, a análise de uma cadeia de caracteres como "12/10/35" com o calendário gregoriano produz a data "10 de dezembro de 2035".
Versão introduzida
.NET 8 versão prévia 1
Tipo de alteração interruptiva
Esta é uma alteração comportamental.
Motivo da alteração
É mais lógico analisar um ano de dois dígitos que está relativamente perto dos dois dígitos do ano atual para produzir um ano de quatro dígitos no século atual, em vez do anterior. O sistema operacional Windows também alterou suas configurações padrão para o mesmo número (2049).
Ação recomendada
Se você não quiser que seu aplicativo dependa do valor padrão ao analisar uma cadeia de caracteres para uma data, poderá controlar como um ano de dois dígitos é traduzido para um ano de quatro dígitos definindo a propriedade TwoDigitYearMax. O código a seguir mostra como defini-lo para a cultura invariável.
CultureInfo clonedInvariantCulture = (CultureInfo)(CultureInfo.InvariantCulture.Clone());
clonedInvariantCulture.DateTimeFormat.Calendar.TwoDigitYearMax = 2039; // Use any desired cutoff value.
DateTime dt = DateTime.Parse("12/25/45", clonedInvariantCulture);
APIs afetadas
- 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 (e outros tipos de calendário gregorianos)
- System.Globalization.GregorianCalendar.ToDateTime (e outros tipos de calendário gregorianos)
- System.Globalization.GregorianCalendar.ToFourDigitYear(Int32) (e outros tipos de calendário gregorianos)