HOW TO:列舉電腦上展示的時區
系統上必須有時區的相關資訊,才能順利使用指派的時區。 Windows XP 及 Windows Vista 作業系統會將這項資訊儲存在登錄中。 然而,雖然全世界的時區總數很多,但是登錄中只有其中一部分的資訊而已。 此外,登錄本身是個動態結構,會受到刻意或意外變更而改變。 因此,應用程式不一定會一直假設系統上定義了或可以使用特定時區。 對於許多使用時區資訊應用程式的應用程式而言,第一步要作的就是判斷本機系統上是否有所需的時區,或是提供使用者時區清單以供選取。 應用程式必須列舉本機系統上所定義的時區才能這麼做。
注意事項 |
---|
如果應用程式必須藉助特定時區,而本機系統上可能沒有定義這個時區,應用程式就可以利用序列化和還原序列化時區資訊的方式,確保時區存在系統中。接著時區就可以新增至清單控制項,供應用程式使用者選取。如需詳細資訊,請參閱 HOW TO:將時區儲存到內嵌資源及 HOW TO:從內嵌資源還原時區。 |
列舉本機系統上存在的時區
呼叫 TimeZoneInfo.GetSystemTimeZones 方法。 這個方法會傳回一個 TimeZoneInfo 物件的泛型 ReadOnlyCollection<T> 集合。 集合中的項目會根據 DisplayName 屬性排序。 例如:
Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
ReadOnlyCollection<TimeZoneInfo> tzCollection; tzCollection = TimeZoneInfo.GetSystemTimeZones();
使用 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);
向使用者呈現本機系統上的時區清單
呼叫 TimeZoneInfo.GetSystemTimeZones 方法。 這個方法會傳回一個 TimeZoneInfo 物件的泛型 ReadOnlyCollection<T> 集合。
將步驟 1 中所傳回的集合指派給 Windows Form 或 ASP.NET 清單控制項的 DataSource 屬性。
擷取使用者選擇的 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.ListBox 或 System.Web.UI.WebControls.BulletedList 控制項) 可讓您將物件變數的集合,指派給 DataSource 屬性,只要該集合實作 IEnumerable 介面就可以 (由泛型 ReadOnlyCollection<T> 類別執行這個動作)。如果要顯示集合中的個別物件,控制項會呼叫此物件的 ToString 方法以擷取用來代表物件的字串。 如果是 TimeZoneInfo 物件,ToString 方法會傳回 TimeZoneInfo 物件的顯示名稱 (DisplayName 屬性的值)。
注意事項 |
---|
因為清單控制項會呼叫物件的 ToString 方法,所以您可以將 TimeZoneInfo 物件的集合指派給控制項、讓控制項顯示每一個物件有意義的名稱,以及擷取使用者所選擇的 TimeZoneInfo 物件。這麼做就可以不必擷取集合中每一個物件的字串、將這個字串指派給集合 (集合會被指派給控制項的 DataSource 屬性)、擷取使用者所選取的字串,以及使用這個字串來擷取所描述的物件。 |
編譯程式碼
這個範例需要:
將 System.Core.dll 的參考加入至專案中。
匯入下列命名空間:
System (C# 程式碼中)