共用方式為


HOW TO:列舉電腦上展示的時區

更新:2007 年 11 月

系統上必須有時區的相關資訊,才能順利使用指派的時區。Windows XP 及 Windows Vista 作業系統會將這項資訊儲存在登錄中。然而,雖然全世界的時區總數很多,但是登錄中只有其中一部分的資訊而已。此外,登錄本身是個動態結構,會受到刻意或意外變更而改變。因此,應用程式不一定會一直假設系統上定義了或可以使用特定時區。對於許多使用時區資訊應用程式的應用程式而言,第一步要作的就是判斷本機系統上是否有所需的時區,或是提供使用者時區清單以供選取。應用程式必須列舉本機系統上所定義的時區才能這麼做。

注意事項:

如果應用程式必須藉助特定時區,而本機系統上可能沒有定義這個時區,應用程式就可以利用序列化和還原序列化時區資訊的方式,確保時區存在系統中。接著時區就可以新增至清單控制項,供應用程式使用者選取。如需詳細資訊,請參閱 HOW TO:將時區儲存到內嵌資源HOW TO:從內嵌資源還原時區

列舉本機系統上存在的時區

  1. 呼叫 TimeZoneInfo.GetSystemTimeZones 方法。這個方法會傳回一個 TimeZoneInfo 物件的泛型 ReadOnlyCollection<T> 集合。集合中的項目會根據 DisplayName 屬性排序。例如:

    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
    
    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    
  2. 使用 foreach 迴圈 (C#) 或 For Each…Next 迴圈 (Visual Basic),列舉集合中的個別 TimeZoneInfo 物件,並在每一個物件上執行必要的處理程序。例如,下列程式碼會列舉步驟 1 中所傳回 TimeZoneInfo 物件的 ReadOnlyCollection<T> 集合,並列出主控台中每一個時區的顯示名稱。

    For Each timeZone As TimeZoneInfo In tzCollection
       Console.WriteLine("   {0}: {1}", timeZone.Id, timeZone.DisplayName)
    Next
    
    foreach (TimeZoneInfo timeZone in tzCollection)
       Console.WriteLine("   {0}: {1}", timeZone.Id, timeZone.DisplayName);
    

向使用者呈現本機系統上的時區清單

  1. 呼叫 TimeZoneInfo.GetSystemTimeZones 方法。這個方法會傳回一個 TimeZoneInfo 物件的泛型 ReadOnlyCollection<T> 集合。

  2. 將步驟 1 中所傳回的集合指派給 Windows Form 或 ASP.NET 清單控制項的 DataSource 屬性。

  3. 擷取使用者選擇的 TimeZoneInfo 物件。

本範例提供 Windows 應用程式的圖例。

範例

本範例會啟動一個 Windows 應用程式,在清單方塊中顯示系統上所定義的時區。然後範例會顯示一個對話方塊,內含使用者所選取時區物件的 DisplayName 屬性值。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo)
   tzCollection = TimeZoneInfo.GetSystemTimeZones()
   Me.timeZoneList.DataSource = tzCollection
End Sub

Private Sub OkButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OkButton.Click
   Dim selectedTimeZone As TimeZoneInfo = DirectCast(Me.timeZoneList.SelectedItem(), TimeZoneInfo)
   MsgBox("You selected the " & selectedTimeZone.ToString() & " time zone.")
End Sub
private void Form1_Load(object sender, EventArgs e)
{
   ReadOnlyCollection<TimeZoneInfo> tzCollection; 
   tzCollection = TimeZoneInfo.GetSystemTimeZones();
   this.timeZoneList.DataSource = tzCollection;
}

private void OkButton_Click(object sender, EventArgs e)
{
   TimeZoneInfo selectedTimeZone = (TimeZoneInfo) this.timeZoneList.SelectedItem;
   MessageBox.Show("You selected the " + selectedTimeZone.ToString() + " time zone.");
}

大部分的清單控制項 (例如 System.Windows.Forms.ListBoxSystem.Web.UI.WebControls.BulletedList 控制項) 可讓您將物件變數的集合,指派給 DataSource 屬性,只要該集合實作 IEnumerable 介面就可以 (由泛型 ReadOnlyCollection<T> 類別執行這個動作)。如果要顯示集合中的個別物件,控制項會呼叫此物件的 ToString 方法以擷取用來代表物件的字串。如果是 TimeZoneInfo 物件,ToString 方法會傳回 TimeZoneInfo 物件的顯示名稱 (DisplayName 屬性的值)。

注意事項:

因為清單控制項會呼叫物件的 ToString 方法,所以您可以將 TimeZoneInfo 物件的集合指派給控制項、讓控制項顯示每一個物件有意義的名稱,以及擷取使用者所選擇的 TimeZoneInfo 物件。這麼做就可以不必擷取集合中每一個物件的字串、將這個字串指派給集合 (集合會被指派給控制項的 DataSource 屬性)、擷取使用者所選取的字串,以及使用這個字串來擷取所描述的物件。

編譯程式碼

這個範例需要:

請參閱

工作

HOW TO:將時區儲存到內嵌資源

HOW TO:從內嵌資源還原時區

其他資源

時間和時區