作法:列舉電腦上既有的時區
若要順利處理指定的時區,需要可供系統使用之時區的相關資訊。 Windows XP 和 Windows Vista 作業系統會將此資訊儲存在登錄中。 不過,雖然全世界的時區總數很大,但是登錄只會包含其中一部分的資訊。 此外,登錄本身是內容很容易變成故意或意外變更的動態結構。 因此,應用程式無法永遠假設特定時區已定義且可在系統上使用。 許多使用時區資訊應用程式之應用程式的第一個步驟,為是否可在本機系統上使用必要時區,或將可從中選取的時區清單提供給使用者。 這需要應用程式列舉本機系統上所定義的時區。
注意
如果應用程式仰賴在本機系統上可能未定義的特定時區,則應用程式可以序列化及還原序列化時區的相關資訊,以確保其存在。 然後,可以將時區新增至清單控制項,使應用程式使用者可加以選取。 如需詳細資料,請參閱如何:將時區儲存到內嵌資源,以及如何:從內嵌資源還原時區。
列舉本機系統上展示的時區
呼叫 TimeZoneInfo.GetSystemTimeZones 方法。 方法會傳回 TimeZoneInfo 物件的泛型 ReadOnlyCollection<T> 集合。 集合中的項目會根據 DisplayName 屬性進行排序。 例如:
ReadOnlyCollection<TimeZoneInfo> tzCollection; tzCollection = TimeZoneInfo.GetSystemTimeZones();
Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
在集合中列舉個別 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
向使用者顯示本機系統上既有時區的清單
呼叫 TimeZoneInfo.GetSystemTimeZones 方法。 方法會傳回 TimeZoneInfo 物件的泛型 ReadOnlyCollection<T> 集合。
將步驟 1 中傳回的集合指派給 Windows Forms 的
DataSource
屬性或 ASP.NET 清單控制項。擷取使用者選取的 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.ListBox 或 System.Web.UI.WebControls.BulletedList 控制項) 讓您只要該集合實作 DataSource
介面,就可將物件變數集合指派給其 IEnumerable 屬性。 (泛型 ReadOnlyCollection<T> 類別會進行此動作。)若要在集合中顯示個別物件,控制項會呼叫該物件的 ToString
方法來擷取用來表示物件的字串。 在 TimeZoneInfo 物件的案例中,ToString
方法會傳回 TimeZoneInfo 物件的顯示名稱 (其 DisplayName 屬性的值)。
注意
因為清單控制項會呼叫物件的 ToString
方法,所以您可以將 TimeZoneInfo 物件的集合指派給控制項、讓控制項顯示每個物件的有意義名稱,並擷取使用者選取的 TimeZoneInfo 物件。 這樣就不需要擷取集合中每個物件的字串、將字串指派給集合 (接著會指派給控制項的 DataSource
屬性)、擷取使用者所選取的字串,然後使用這個字串來擷取其所描述的物件。
編譯程式碼
這個範例需要:
要匯入下列命名空間:
System (在 C# 程式碼中)