Nasıl yapılır: Bir bilgisayarda mevcut saat dilimlerini numaralandırma

Belirlenen bir saat dilimiyle başarılı bir şekilde çalışmak için bu saat dilimiyle ilgili bilgilerin sistem tarafından kullanılabilir olması gerekir. Windows XP ve Windows Vista işletim sistemleri bu bilgileri kayıt defterinde depolar. Ancak, dünya genelinde mevcut olan toplam saat dilimi sayısı büyük olsa da, kayıt defteri bunların yalnızca bir alt kümesi hakkında bilgi içerir. Ayrıca, kayıt defterinin kendisi, içeriği hem kasıtlı hem de yanlışlıkla yapılan değişikliğe tabi olan dinamik bir yapıdır. Sonuç olarak, bir uygulama her zaman belirli bir saat diliminin tanımlandığını ve bir sistemde kullanılabilir olduğunu varsayamaz. Saat dilimi bilgi uygulamalarını kullanan birçok uygulama için ilk adım, gerekli saat dilimlerinin yerel sistemde kullanılabilir olup olmadığını belirlemek veya kullanıcıya içinden seçim yapılacak saat dilimlerinin listesini vermektir. Bunun için bir uygulamanın yerel sistemde tanımlanan saat dilimlerini listelemesi gerekir.

Not

Bir uygulama, yerel sistemde tanımlanmayan belirli bir saat diliminin varlığına dayanırsa, saat dilimiyle ilgili bilgileri seri hale getirerek ve seri durumdan çıkararak uygulamanın varlığından emin olabilir. Ardından, uygulama kullanıcısının seçebilmesi için saat dilimi bir liste denetimine eklenebilir. Ayrıntılar için bkz . Nasıl yapılır: Katıştırılmış Kaynağa Saat Dilimlerini Kaydetme ve Nasıl yapılır: Katıştırılmış bir kaynaktan saat dilimlerini geri yükleme.

Yerel sistemde mevcut saat dilimlerini numaralandırmak için

  1. yöntemini çağırın TimeZoneInfo.GetSystemTimeZones . yöntemi, genel ReadOnlyCollection<T> bir nesne koleksiyonu TimeZoneInfo döndürür. Koleksiyondaki girdiler özelliklerine DisplayName göre sıralanır. Örneğin:

    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    
    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
    
  2. Bir döngü (C#'de) veya For Eachbir ... kullanarak foreach koleksiyondaki tek tek TimeZoneInfo nesneleri numaralandırın.Next döngü (Visual Basic'te) ve her nesne üzerinde gerekli işlemleri gerçekleştirin. Örneğin, aşağıdaki kod 1. adımda döndürülen nesnelerin koleksiyonunu TimeZoneInfo numaralandırır ReadOnlyCollection<T> ve konsoldaki her saat diliminin görünen adını listeler.

    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
    

Kullanıcıya yerel sistemde bulunan saat dilimlerinin listesini sunmak için

  1. yöntemini çağırın TimeZoneInfo.GetSystemTimeZones . yöntemi, genel ReadOnlyCollection<T> bir nesne koleksiyonu TimeZoneInfo döndürür.

  2. 1 DataSource . adımda döndürülen koleksiyonu windows formlarının veya ASP.NET liste denetiminin özelliğine atayın.

  3. TimeZoneInfo Kullanıcının seçtiği nesneyi alın.

Örnek, bir Windows uygulaması için bir çizim sağlar.

Örnek

Örnek, bir sistemde tanımlanan saat dilimlerini liste kutusunda görüntüleyen bir Windows uygulaması başlatır. Örnekte daha sonra kullanıcı tarafından seçilen saat dilimi nesnesinin DisplayName özelliğinin değerini içeren bir iletişim kutusu görüntülenir.

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

Liste denetimlerinin çoğu (veya denetimi gibiSystem.Windows.Forms.ListBox), bu koleksiyon arabirimi uyguladığı IEnumerable sürece kendi özelliklerine DataSource nesne değişkenlerinden oluşan bir koleksiyon atamanıza olanak System.Web.UI.WebControls.BulletedList sağlar. (Bunu genel ReadOnlyCollection<T> sınıf yapar.) Koleksiyonda tek bir nesneyi görüntülemek için, denetim nesnenin yöntemini çağırarak nesneyi ToString temsil etmek için kullanılan dizeyi ayıklar. Nesneler söz konusu olduğunda TimeZoneInfo , ToString yöntemi nesnenin TimeZoneInfo görünen adını (özelliğinin DisplayName değeri) döndürür.

Not

Liste denetimleri bir nesnenin ToString yöntemini çağırdığından, denetime bir nesne koleksiyonu TimeZoneInfo atayabilir, denetimin her nesne için anlamlı bir ad görüntülemesini sağlayabilir ve kullanıcının seçtiği nesneyi alabilirsiniz TimeZoneInfo . Bu, koleksiyondaki her nesne için bir dize ayıklama, dizeyi sırayla denetimin DataSource özelliğine atanmış bir koleksiyona atama, kullanıcının seçtiği dizeyi alma ve ardından bu dizeyi kullanarak tanımladığı nesneyi ayıklama gereksinimini ortadan kaldırır.

Kod derleme

Bu örnek şunları gerektirir:

Ayrıca bkz.