Me he encontrado con un problema que probablemente se deba a mi error de comprensión sobre cómo funciona el método DateTime.ToShortTimeString(). Cuando el formato de cadenas de tiempo con esta función, estaba asumiendo que respetaría el "tiempo corto" puesta en Opciones de formato de Windows 7.¿Por qué DateTime.ToShortTimeString() no respeta el formato de tiempo corto en "Configuración regional y de idioma"?
Control Panel -> Clock, Language and Region -> Region and Language -> Formats Tab.
Sin embargo .NET parece para seleccionar un formato de corta duración no se basa en esta configuración, pero basada en la cultura actual:
Region and Language -> Location -> Current Location
hice algunas pruebas en Windows 7 RC:
Culture: en-GB, 6AM: 06:00, 6PM: 18:00 // HH:mm (United Kingdom) Culture: en-GB, 6AM: 06:00, 6PM: 18:00 // hh:mm (United Kingdom) Culture: en-US, 6AM: 6:00 AM, 6PM: 6:00 PM // HH:mm (United States) Culture: en-US, 6AM: 6:00 AM, 6PM: 6:00 PM // hh:mm (United States) Culture: el-GR, 6AM: 6:00 πμ, 6PM: 6:00 μμ // HH:mm (Greece) Culture: el-GR, 6AM: 6:00 πμ, 6PM: 6:00 μμ // hh:mm (Greece)
utilicé el-GR ya que era la cultura que el usuario que repor con el problema, también probó esto en Vista SP2 y Win 7 RC con el mismo resultado.
La pregunta es en realidad doble: 1) ¿Cuál es mi incomprensión de los formatos .NET y Windows? 2) ¿Cuál es la mejor solución para crear una cadena de tiempo de formato corto (HH: mm o hh: mm tt) basada en el sistema operativo, idealmente debería funcionar en Mono así que preferiría evitar leer desde el registro o P/Invocar.
Método utilizado para generar lo anterior, para futuras referencias y pruebas.
[STAThread]
static void Main(string[] args)
{
CultureInfo culture = CultureInfo.CurrentCulture;
DateTime sixAm = new DateTime(2009, 07, 05, 6, 0, 0); // 6AM
DateTime sixPm = new DateTime(2009, 07, 05, 18, 0, 0); // 6PM
string sixAmString = sixAm.ToShortTimeString();
string sixPmString = sixPm.ToShortTimeString();
string format = "Culture: {0}, 6AM: {1}, 6PM: {2}";
string output = String.Format(format, culture, sixAmString, sixPmString);
Console.WriteLine(output);
Clipboard.Clear();
Clipboard.SetText(output);
Console.ReadKey();
}
Actualización: Basándose en los comentarios de Mike a continuación Adapté el método anterior con los siguientes cambios:
Los siguientes dos líneas
string sixAmString = sixAm.ToShortTimeString();
string sixPmString = sixPm.ToShortTimeString();
cambiado a
string sixAmString = sixAm.ToString("t", culture);
string sixPmString = sixPm.ToString("t", culture);
I als o Cambió la variable de cultivo para usar CultureInfo.CurrentUICulture.
Esto desafortunadamente no funciona tan bien como esperaba, la salida independientemente de la configuración de tiempo corto en la pestaña Formatos de Windows 7 fue:
Culture: en-US, 6AM: 6:00 AM, 6PM: 6:00 PM
parece que el CultureInfo.CurrentUICulture es siempre en- NOS.
Gracias, haré algunas pruebas con eso y me pondré en práctica. ¿Qué otra cosa se ve afectada por el cultivo que no sean separadores de fecha, hora, moneda, decimal y mil? –
Mes, nombres de días laborables. Direcciones LTR/RTL. Clasificación de cadenas. Operaciones de mayúsculas/minúsculas con cadenas. Publicación por entregas. –
CultureInfo.CurrentUICulture parece ser en EE. UU., ¿En qué otro lugar podría configurarse? Intenté volver a enviar el cheque después de comprobar que todo estaba configurado en el Reino Unido. También noté que, a veces, después de ejecutar el programa, no recogen el cambio de cultura inmediatamente. Sin embargo, ejecutarlo por segunda vez siempre lo recoge. –