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
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
Bir döngü (C#'de) veya
For Each
bir ... kullanarakforeach
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
yöntemini çağırın TimeZoneInfo.GetSystemTimeZones . yöntemi, genel ReadOnlyCollection<T> bir nesne koleksiyonu TimeZoneInfo döndürür.
1
DataSource
. adımda döndürülen koleksiyonu windows formlarının veya ASP.NET liste denetiminin özelliğine atayın.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:
Aşağıdaki ad alanlarının içeri aktarılacağı:
System (C# kodunda)