Postupy: Vytvoření výčtu časových pásem přítomných na počítači
Úspěšná práce s určeným časovým pásmem vyžaduje, aby byly pro systém k dispozici informace o daném časovém pásmu. Operační systémy Windows XP a Windows Vista ukládají tyto informace do registru. I když je však celkový počet časových pásem, které existují po celém světě, velký, registr obsahuje informace o pouze podmnožině z nich. Kromě toho samotný registr je dynamická struktura, jejíž obsah podléhá záměrné i náhodné změně. V důsledku toho aplikace nemůže vždy předpokládat, že je v systému definováno a dostupné určité časové pásmo. Prvním krokem pro mnoho aplikací, které používají informační aplikace časového pásma, je určit, zda jsou požadovaná časová pásma k dispozici v místním systému, nebo poskytnout uživateli seznam časových pásem, ze kterých se má vybrat. To vyžaduje, aby aplikace výčet časových pásem definovaných v místním systému.
Poznámka:
Pokud aplikace spoléhá na přítomnost konkrétního časového pásma, které nemusí být definováno v místním systému, může aplikace zajistit její přítomnost serializací a deserializací informací o časovém pásmu. Časové pásmo pak můžete přidat do ovládacího prvku seznamu, aby ho uživatel aplikace mohl vybrat. Podrobnosti najdete v tématu Postupy: Úspora časových pásem do vloženého prostředku a postupy: Obnovení časových pásem z vloženého prostředku.
Výčet časových pásem, které jsou přítomné v místním systému
Zavolejte metodu TimeZoneInfo.GetSystemTimeZones . Metoda vrátí obecnou ReadOnlyCollection<T> kolekci TimeZoneInfo objektů. Položky v kolekci jsou seřazeny podle jejich DisplayName vlastnosti. Příklad:
ReadOnlyCollection<TimeZoneInfo> tzCollection; tzCollection = TimeZoneInfo.GetSystemTimeZones();
Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
Zobrazení výčtu jednotlivých TimeZoneInfo objektů v kolekci pomocí
foreach
smyčky (v jazyce C#) neboFor Each
...Next
smyčka (v jazyce Visual Basic) a proveďte veškeré potřebné zpracování u každého objektu. Například následující kód vypíše ReadOnlyCollection<T> kolekci TimeZoneInfo objektů vrácených v kroku 1 a zobrazí zobrazovaný název každého časového pásma v konzole.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
Prezentace uživatele se seznamem časových pásem v místním systému
Zavolejte metodu TimeZoneInfo.GetSystemTimeZones . Metoda vrátí obecnou ReadOnlyCollection<T> kolekci TimeZoneInfo objektů.
Přiřaďte kolekci vrácenou v kroku 1 k
DataSource
vlastnosti ovládacího prvku Windows Forms nebo ASP.NET seznamu.TimeZoneInfo Načtěte objekt, který uživatel vybral.
Příklad obsahuje ilustraci pro aplikaci pro Windows.
Příklad
Příklad spustí aplikaci systému Windows, která zobrazí časová pásma definovaná v systému v seznamu. Příklad pak zobrazí dialogové okno, které obsahuje hodnotu DisplayName vlastnosti objektu časového pásma vybraného uživatelem.
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
Většina ovládacích prvků seznamu (například ovládací System.Web.UI.WebControls.BulletedListSystem.Windows.Forms.ListBox prvek) umožňuje přiřadit kolekci proměnných objektů k jejich DataSource
vlastnosti, pokud tato kolekce implementuje IEnumerable rozhraní. (Obecná ReadOnlyCollection<T> třída to dělá.) Chcete-li zobrazit jednotlivé objekty v kolekci, ovládací prvek volá metodu objektu ToString
extrahovat řetězec, který se používá k reprezentaci objektu. V případě TimeZoneInfo objektů ToString
vrátí TimeZoneInfo metoda zobrazovaný název objektu (hodnota jeho DisplayName vlastnosti).
Poznámka:
Vzhledem k tomu, že ovládací prvky seznamu volají metodu objektu ToString
, můžete přiřadit kolekci TimeZoneInfo objektů ovládacímu prvku, zobrazit ovládací prvek smysluplný název pro každý objekt a načíst TimeZoneInfo objekt, který uživatel vybral. Tím se eliminuje nutnost extrahovat řetězec pro každý objekt v kolekci, přiřadit řetězec kolekci, která je zase přiřazena k vlastnosti ovládacího prvku DataSource
, načíst řetězec, který uživatel vybral, a pak tento řetězec použít k extrahování objektu, který popisuje.
Zkompilování kódu
Tento příklad vyžaduje:
Importují se následující obory názvů:
System (v kódu jazyka C#)