Se supone que DateTimeFormatInfo.GetShortestDayName(DayOfWeek) devuelve nombres como Su , Mo , etc., como se muestra en el resultado del ejemplo en la documentación de Microsoft .
En cambio, solo obtengo una letra: S , M , etc.
Código para reproducir: (estoy usando WPF .Net 6)
DateTimeFormatInfo en_us = CultureInfo.GetCultureInfo("en-US").DateTimeFormat; string s = en_us.GetShortestDayName(DayOfWeek.Tuesday); Esto no me sirve ya que martes y jueves por ejemplo, tienen el mismo identificador. ¿Qué podría causar este problema, para que pueda solucionarlo y obtener el Su , Mo , etc. esperado?
Puede agregar la siguiente configuración a su archivo de proyecto ( .csproj ) para no usar las API de globalización de ICU que se introdujeron en .NET 5:
<ItemGroup> <RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" /> </ItemGroup>Es probable que esto sea "por diseño" como resultado de cambiar de la forma específica de Windows de obtener información de globalización a datos disponibles públicamente.
El siguiente artículo Cambio importante: las API de globalización usan bibliotecas ICU en Windows explican el cambio (pero, de hecho, no entra en detalles como "si se cambian los nombres cortos"):
A partir de .NET 5, si una aplicación se ejecuta en la actualización de mayo de 2019 de Windows 10 o posterior, las bibliotecas .NET usan las API de globalización de ICU de manera predeterminada.
Y el sitio de la UCI enumera las abreviaturas como uno de los componentes (el resaltado es mío):
Formato: formatee números, fechas, horas y cantidades de moneda de acuerdo con las convenciones de una ubicación elegida. Esto incluye traducir los nombres de los meses y los días al idioma seleccionado, elegir las abreviaturas apropiadas , ordenar los campos correctamente, etc. Estos datos también provienen del repositorio de datos de configuración regional común.
Esto parece ser un cambio de .NET 4.7.2 a .NET Core 6 (posiblemente todas las versiones de .NET Core; no puedo confirmarlo en este momento).
En .NET 4.7.2 obtengo resultados de dos caracteres; en .NET 6 obtengo resultados de un carácter.
Tampoco veo ninguna documentación en línea que indique que el cambio fue un cambio de ruptura intencional.
Enviaría un ticket de error para actualizar la documentación (y admitir que fue un cambio importante) o revertir el comportamiento.
Una solución sería tomar los primeros dos caracteres de GetAbbreviatedDayName .