Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las clases de calendario, como GregorianCalendar, tienen una TwoDigitYearMax propiedad que define el último año de un intervalo de 100 años que se puede representar mediante un año de dos dígitos. Esta propiedad se usa a menudo para traducir un año de dos dígitos a un año de cuatro dígitos. Anteriormente, Calendar.TwoDigitYearMax el valor predeterminado era 2029 para GregorianCalendar y otros calendarios similares al gregoriano, como JulianCalendar y EastAsianLunisolarCalendar. Ese valor significaba que los años de dos dígitos de 00 a 29 se traducen a 2000-2029. Años de dos dígitos, del 30 al 99, se convierten en los años 1930-1999. El valor de propiedad predeterminado TwoDigitYearMax para GregorianCalendar y otros calendarios similares a gregorianos ahora ha cambiado de 2029 a 2049. El nuevo valor significa que los años de dos dígitos de 00 a 49 se traducen a 2000-2049. Cualquier año de 50 a 99 se traducirá a 1950-1999.
Además, en Windows, el valor predeterminado de la propiedad TwoDigitYearMax ahora se obtiene de la configuración de Windows correspondiente, cuyo valor predeterminado ahora es también 2049. Esto coincide con el comportamiento anterior a .NET 5.
El análisis de fechas es la funcionalidad más afectada por este cambio.
Comportamiento anterior
En .NET 6 y .NET 7, si no especificó un valor para TwoDigitYearMax, analizar una cadena como "12/10/35" con el calendario gregoriano produjo la fecha "10 de diciembre de 1935".
Nuevo comportamiento
A partir de .NET 8, analizar una cadena como "12/10/35" con el calendario gregoriano genera la fecha "10 de diciembre de 2035".
Versión introducida
.NET 8 Preview 1
Tipo de cambio disruptivo
Este es un cambio de comportamiento.
Motivo del cambio
Es más lógico analizar un año de dos dígitos que está relativamente cerca de los dos dígitos del año actual para generar un año de cuatro dígitos en el siglo actual en lugar del anterior. El sistema operativo Windows también cambió su configuración predeterminada al mismo número (2049).
Acción recomendada
Si no quieres que tu aplicación dependa del valor predeterminado al analizar una cadena en una fecha, puedes controlar cómo se traduce un año de dos dígitos a un año de cuatro dígitos estableciendo la TwoDigitYearMax propiedad . En el código siguiente se muestra cómo establecerlo para la referencia cultural invariable.
CultureInfo clonedInvariantCulture = (CultureInfo)(CultureInfo.InvariantCulture.Clone());
clonedInvariantCulture.DateTimeFormat.Calendar.TwoDigitYearMax = 2039; // Use any desired cutoff value.
DateTime dt = DateTime.Parse("12/25/45", clonedInvariantCulture);
Las APIs afectadas
- 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 (y otros tipos de calendario similares a gregorianos)
- System.Globalization.GregorianCalendar.ToDateTime (y otros tipos de calendario similares a gregorianos)
- System.Globalization.GregorianCalendar.ToFourDigitYear(Int32) (y otros tipos de calendario similares a gregorianos)