2011-09-04 9 views
7

Necesito determinar si la cultura/configuración regional actual está configurada para usar la hora am/pm o la hora de 24 horas.¿Cómo determinar si la cultura/lugar actual usa am/pm o la hora de 24 horas?

Al principio pensé que podía hacer esto:

bool time24Hour = Thread.CurrentThread.CurrentCulture.DateTimeFormat.AMDesignator == ""; 

Pero luego leí los comentarios sobre la última respuesta en este hilo Get just the hour of day from DateTime using either 12 or 24 hour format as defined by the current culture que parece dar a entender que esto no funcionará.

Supongo que podría formatear un tiempo arbitrario, y luego analizar los resultados, pero seguramente hay una manera más simple.

EDIT:

Véase también mi comentario abajo - Sólo quiero para determinar cuál de las dos cadenas constantes pre-formateados que contienen listas de horas que debería seleccionar, y la esperanza de evitar una gran cantidad de contorsiones innecesarios - acabo Necesito una respuesta sí/no en cuanto a si se trata de una cultura am/pm o una cultura de 24 horas.

El programa es un programa de WinForms, si eso sirve de ayuda.

+0

¿Por qué es importante para usted? –

+1

Necesito seleccionar una de las dos listas de horas pregeneradas y constantes, ya sea "9 10 11 12 13 14 15 16 17" o "9 10 11 12 1 2 3 4 5", dependiendo de la cultura. Espero que no sea necesario pasar por muchas contorsiones que involucren DateTime y formateo, etc. – RenniePet

+0

Primero, debe editar su pregunta para incluir esa información. Segundo, ¿estás usando Windows Forms? ¿Formas web? Silverlight? –

Respuesta

9

Intente comprobar si DateTimeFormat.ShortTimePattern contiene H. Si lo hace, el sistema está usando las 24 horas

+0

Gracias, parece el enfoque adecuado. Pero, ¿no sería aún más correcto probar solo "H"? (O "HH", pero eso sería redundante.) – RenniePet

+0

Otro punto muy secundario: puedo ver que agregaste WinForms como etiqueta para mi pregunta, pero ¿no es mi pregunta y tu respuesta independiente del sistema de presentación que se usa? – RenniePet

+0

1) Tienes razón, edité mi respuesta 2) Lo hice solo porque dijiste que lo estás haciendo en Winforms. No estoy seguro si Silverlight y WPF tienen una forma diferente de hacer esto. –

2

Solo una pequeña adición si puedo. En base a la respuesta de dario_ramos, convertí esto en un método de extensión con una prueba de unidad de apoyo, que pasa a mi sistema (verificando 378 culturas).

public static class DateTimeExtensions 
{ 
    public static bool Is24Hrs(this CultureInfo cultureInfo) 
    { 
     return cultureInfo.DateTimeFormat.ShortTimePattern.Contains("H"); 
    } 
} 

[TestClass] 
public class DateTimeExtensionTests 
{ 
    [TestMethod] 
    public void Unit_Can_Determine_If_Culture_Uses_24HrTime() 
    { 
     var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures); 
     foreach (var cultureInfo in cultures) 
     { 
      Thread.CurrentThread.CurrentCulture = cultureInfo; 
      var datetime = new DateTime(2000, 1, 1, 23, 0, 0); 
      var formatted = datetime.ToString("t"); 
      var is24Hrs = formatted.Contains("23"); 
      Assert.AreEqual(is24Hrs, cultureInfo.Is24Hrs()); 
     } 
    } 
} 
Cuestiones relacionadas