Sdílet prostřednictvím


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

  1. 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
    
  2. Zobrazení výčtu jednotlivých TimeZoneInfo objektů v kolekci pomocí foreach smyčky (v jazyce C#) nebo For 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

  1. Zavolejte metodu TimeZoneInfo.GetSystemTimeZones . Metoda vrátí obecnou ReadOnlyCollection<T> kolekci TimeZoneInfo objektů.

  2. Přiřaďte kolekci vrácenou v kroku 1 k DataSource vlastnosti ovládacího prvku Windows Forms nebo ASP.NET seznamu.

  3. 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:

Viz také