.net - net - datetime format c#
¿Por qué DateTime.ToShortTimeString() no respeta el formato de tiempo corto en "Configuración regional y de idioma"? (3)
En respuesta a cada una de mis preguntas:
1) ¿Cuál es mi incomprensión de los formatos .NET y Windows?
La respuesta corta es que no hay ningún vínculo entre la configuración de "Tiempo corto" en la configuración "Regional y de idioma" y la propiedad ShortTimePattern de .NET. Sin embargo, la propiedad LongTimePattern viene dictada por la configuración "Long Time".
Adapte el método anterior reemplazando las dos líneas de formato a:
string sixAmString = sixAm.ToString("T", culture.DateTimeFormat);
string sixPmString = sixPm.ToString("T", culture.DateTimeFormat);
Aquí está el resultado:
Culture: en-GB, 6AM: 06:00:00, 6PM: 18:00:00 // HH:mm:ss Culture: en-GB, 6AM: 06:00:00 AM, 6PM: 06:00:00 PM //hh:mm:ss tt
La parte inferior de este artículo me explicó el problema.
2) ¿Cuál es la mejor solución para crear una cadena de tiempo de formato corto (HH: mm o hh: mm tt) según la configuración del sistema operativo?
No sé cuál es la mejor solución, pero creé la siguiente función que convierte el LongTimeFormat a ShortTimeFormat, lo que permite que una aplicación siga la opción de los usuarios si cambian el "Long Time" (aunque no seguirá el "Short"). Configuracion de hora).
static string GetShortTimeString(DateTime ShortTimeString)
{
DateTimeFormatInfo dateTimeFormat = CultureInfo.CurrentCulture.DateTimeFormat;
string ShortTimePattern = dateTimeFormat.LongTimePattern.Replace(":ss", String.Empty);
ShortTimePattern = ShortTimePattern.Replace(":s", String.Empty);
return ShortTimeString.ToString(ShortTimePattern);
}
El resultado después de hacer los cambios anteriores:
Culture: en-GB, 6AM: 06:00, 6PM: 18:00 Culture: en-GB, 6AM: 06:00 AM, 6PM: 06:00 PM
La opción P / Invoke es usar GetTimeFormat pasando TIME_NOSECONDS usando DateTime.ToString (Format) como se indicó anteriormente. No he probado esto, ya que preferiría evitar el uso de P / Invoke.
Me encontré con un problema que probablemente se debe a mi error de comprensión sobre cómo funciona el método DateTime.ToShortTimeString (). Al formatear cadenas de tiempo con esta función, asumí que respetaría la configuración de "Tiempo corto" en la configuración de Formato de Windows 7
Control Panel -> Clock, Language and Region -> Region and Language -> Formats Tab.
Sin embargo, .NET parece seleccionar un formato de tiempo corto que no se basa en esta configuración, sino que se basa 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 esa era la cultura con la que el usuario que reportó el problema, también probó esto en Vista SP2 y Win 7 RC con el mismo resultado.
La pregunta es realmente 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, por lo 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: En base a los comentarios de Mike a continuación, adapté el método anterior con los siguientes cambios:
Las 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);
También cambié la variable de cultivo para usar CultureInfo.CurrentUICulture.
Desafortunadamente, esto no funcionó tan bien como esperaba, la salida, independientemente de la configuración de Short Time en la pestaña Formats de Windows 7, fue:
Culture: en-US, 6AM: 6:00 AM, 6PM: 6:00 PM
Parece que CultureInfo.CurrentUICulture siempre está en-US.
Estoy bastante seguro de que el hecho de que la cadena de formato de tiempo corto no se use en DateTime.ToShortTimeString () o DateTime.ToString ("t") es un error, ya que se corrigió en .NET Framework 4.0.
La respuesta a tu segunda pregunta es
DateTimeFormat.Format(DateTime.Now, "t", CultureInfo.CurrentUICulture);
o
DateTime.Now.ToString("t", CultureInfo.CurrentUICulture);
En realidad, siempre es mejor usar métodos explícitos que acepten CultureInfo. No hay consistencia en cómo .Net elige qué usar de forma predeterminada, ya sea CurrentCulture o CurrentUICulture o InvarinatCulture.
Para completar la respuesta. También describiré las diferencias entre culturas.
Así que CurrentCulture es "Panel de control -> Reloj, idioma y región -> Región e idioma -> ficha Formatos". Esta es la cultura que espera que sean sus cálculos. Por ejemplo, puede realizar su contabilidad en EE. UU., Por lo que debe configurar esto en los EE. UU.
CurrentUICulture es "Región e idioma -> Idioma de visualización", significa que cuando es emigrante de Ucrania, desea que su aplicación se ubique en UA (pero todos los cálculos siguen en EE. UU.).
Y a InvariantCulture se le conoce como cultura local agnóstica. Debe usar esto para almacenar información, etc. Efectivamente es En-US.
Nota: podría estar equivocado donde cada configuración se encuentra en Windows. Pero probablemente tengas una idea.