2011-09-04 11 views
7

Devo determinare se la cultura/locale corrente è impostata per utilizzare am/pm time o 24 ore.Come determinare se cultura/locale correnti utilizzano am/pm o 24 ore?

In un primo momento ho pensato che avrei potuto fare questo:

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

Ma poi ho letto i commenti sul l'ultima risposta su questa discussione Get just the hour of day from DateTime using either 12 or 24 hour format as defined by the current culture che sembra implicare questo non funzionerà.

Immagino di poter formattare un tempo arbitrario e quindi analizzare i risultati, ma sicuramente c'è un modo più semplice?

EDIT:

Vedi anche il mio commento qui sotto - voglio solo per determinare quale delle due stringhe costanti pre-formattati contenenti elenchi di ore devo selezionare, e la speranza di evitare un sacco di contorsioni inutili - ho solo Ho bisogno di una risposta sì/no se questa è una cultura am/pm o una cultura di 24 ore.

Il programma è un programma WinForms, se questo è di qualche aiuto.

+0

Perché è importante per te? –

+1

Devo selezionare uno dei due elenchi di ore pre-generate e costanti, "9 10 11 12 13 14 15 16 17" o "9 10 11 12 1 2 3 4 5", a seconda della cultura. Spero che non sia necessario passare attraverso molte contorsioni che coinvolgono DateTime e formattazione e così via. – RenniePet

+0

Innanzitutto, è necessario modificare la domanda per includere tali informazioni. Secondo, stai usando Windows Form? Moduli Web? Silverlight? –

risposta

9

Provare a verificare se DateTimeFormat.ShortTimePattern contiene H. Se lo fa, il sistema utilizza 24 ore

+0

Grazie, sembra l'approccio corretto. Ma non sarebbe ancora più corretto testare solo per "H"? (O "HH", ma sarebbe ridondante.) – RenniePet

+0

Un altro punto molto secondario - Vedo che hai aggiunto WinForms come tag per la mia domanda, ma non è la mia domanda e la tua risposta indipendente dal sistema di presentazione utilizzato? – RenniePet

+0

1) Hai ragione, ho modificato la mia risposta 2) L'ho fatto solo perché hai detto che lo stai facendo in Winforms. Non sono sicuro che Silverlight e WPF abbiano un modo diverso di farlo. –

2

Solo una piccola aggiunta se posso. Basandomi sulla risposta di dario_ramos, l'ho trasformato in un metodo di estensione con un test unitario di supporto, che passa sul mio sistema (controllando 378 culture).

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()); 
     } 
    } 
} 
Problemi correlati