作法:列舉電腦上既有的時區

若要順利處理指定的時區,需要可供系統使用之時區的相關資訊。 Windows XP 和 Windows Vista 作業系統會將此資訊儲存在登錄中。 不過,雖然全世界的時區總數很大,但是登錄只會包含其中一部分的資訊。 此外,登錄本身是內容很容易變成故意或意外變更的動態結構。 因此,應用程式無法永遠假設特定時區已定義且可在系統上使用。 許多使用時區資訊應用程式之應用程式的第一個步驟,為是否可在本機系統上使用必要時區,或將可從中選取的時區清單提供給使用者。 這需要應用程式列舉本機系統上所定義的時區。

注意

如果應用程式仰賴在本機系統上可能未定義的特定時區,則應用程式可以序列化及還原序列化時區的相關資訊,以確保其存在。 然後,可以將時區新增至清單控制項,使應用程式使用者可加以選取。 如需詳細資料,請參閱如何:將時區儲存到內嵌資源,以及如何:從內嵌資源還原時區

列舉本機系統上展示的時區

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

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

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

向使用者顯示本機系統上既有時區的清單

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

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

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

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

範例

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

private void Form1_Load(object sender, EventArgs e)
{
    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    _timeZoneList.DataSource = tzCollection;
}

private void OkButton_Click(object sender, EventArgs e)
{
    TimeZoneInfo? selectedTimeZone = (TimeZoneInfo?)_timeZoneList.SelectedItem;
    MessageBox.Show($"You selected the {selectedTimeZone?.ToString()} time zone.");
}
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

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

注意

因為清單控制項會呼叫物件的 ToString 方法,所以您可以將 TimeZoneInfo 物件的集合指派給控制項、讓控制項顯示每個物件的有意義名稱,並擷取使用者選取的 TimeZoneInfo 物件。 這樣就不需要擷取集合中每個物件的字串、將字串指派給集合 (接著會指派給控制項的 DataSource 屬性)、擷取使用者所選取的字串,然後使用這個字串來擷取其所描述的物件。

編譯程式碼

這個範例需要:

另請參閱