2011-09-04 46 views
7

我需要確定當前的文化/語言環境是否設置爲使用am/pm時間或24小時時間。如何確定當前的文化/場所是否使用am/pm或24小時制?

起初,我以爲我可以這樣做:

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

但後來我讀了這個線程Get just the hour of day from DateTime using either 12 or 24 hour format as defined by the current culture這似乎意味着這將無法工作的最後答案的評論。

我想我可以格式化任意時間,然後分析結果,但肯定有一個更簡單的方法?

編輯:

參見我下面的評論 - 我只是想確定包含小時列表我應該選擇,兩個預格式化字符串常量之一,並希望能避免很多不必要的扭曲 - 我只是對於這是上午/下午文化還是24小時文化,需要肯定/否定的答案。

該程序是一個WinForms程序,如果有任何幫助。

+0

爲什麼這對你很重要? –

+1

根據不同的文化,我需要選擇兩個預先生成和常量的小時列表中的一個,「9 10 11 12 13 14 15 16 17」或「9 10 11 12 1 2 3 4 5」。我希望沒有必要經歷很多涉及DateTime和格式等的扭曲。 – RenniePet

+0

首先,您應該編輯您的問題以包含該信息。其次,你使用Windows Forms嗎? Web窗體? Silverlight的? –

回答

9

嘗試檢查DateTimeFormat.ShortTimePattern是否包含H。如果是這樣,系統正在使用24小時制的時間

+0

謝謝,這看起來像正確的做法。但是測試「H」會不會更正確? (或者「HH」,但這將是多餘的。) – RenniePet

+0

另一個非常小的觀點 - 我可以看到你添加了WinForms作爲我的問題的標記,但是不是我的問題和你的答案獨立於正在使用的表示系統嗎? – RenniePet

+0

1)你是對的,我編輯了我的答案2)我這樣做只是因爲你說你在Winforms中做的。不確定Silverlight和WPF是否有不同的方式來執行此操作。 –

2

只要我可以做一個小小的添加。根據dario_ramos的回答,我把它變成了一個支持單元測試的擴展方法,它通過我的系統(檢查378個文化)。

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()); 
     } 
    } 
} 
相關問題