Nasıl yapılır: TimeZoneInfo nesnesi alma

Bir nesneyi edinmenin TimeZoneInfo en yaygın yolu, bu nesne hakkındaki bilgileri kayıt defterinden almaktır. Nesnesini almak için, kayıt defterinde görünen (Shared Visual Basic'te) TimeZoneInfo.FindSystemTimeZoneById yöntemini çağırın static . Yöntemi tarafından oluşan özel durumları, özellikle TimeZoneNotFoundException de saat dilimi kayıt defterinde tanımlanmamışsa oluşan özel durumları işleyin.

Not

.NET 8'den başlayarak, TimeZoneInfo.FindSystemTimeZoneById yeni bir nesne örneği oluşturmak yerine önbelleğe alınmış TimeZoneInfo bir nesne döndürür. Daha fazla bilgi için bkz . FindSystemTimeZoneById yeni nesne döndürmüyor.

Örnek

Aşağıdaki kod, Doğu Standart Saat dilimini temsil eden bir TimeZoneInfo nesneyi alır ve yerel saate karşılık gelen Doğu Standart saatini görüntüler.

DateTime timeNow = DateTime.Now;
try
{
    TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
    DateTime easternTimeNow = TimeZoneInfo.ConvertTime(
        timeNow,
        TimeZoneInfo.Local,
        easternZone
        );
    Console.WriteLine("{0} {1} corresponds to {2} {3}.",
                      timeNow,
                      TimeZoneInfo.Local.IsDaylightSavingTime(timeNow) ?
                                TimeZoneInfo.Local.DaylightName :
                                TimeZoneInfo.Local.StandardName,
                      easternTimeNow,
                      easternZone.IsDaylightSavingTime(easternTimeNow) ?
                                  easternZone.DaylightName :
                                  easternZone.StandardName);
}
// Handle exception
//
// As an alternative to simply displaying an error message, an alternate Eastern
// Standard Time TimeZoneInfo object could be instantiated here either by restoring
// it from a serialized string or by providing the necessary data to the
// CreateCustomTimeZone method.
catch (TimeZoneNotFoundException)
{
    Console.WriteLine("The Eastern Standard Time Zone cannot be found on the local system.");
}
catch (InvalidTimeZoneException)
{
    Console.WriteLine("The Eastern Standard Time Zone contains invalid or missing data.");
}
catch (SecurityException)
{
    Console.WriteLine("The application lacks permission to read time zone information from the registry.");
}
catch (OutOfMemoryException)
{
    Console.WriteLine("Not enough memory is available to load information on the Eastern Standard Time zone.");
}
// If we weren't passing FindSystemTimeZoneById a literal string, we also
// would handle an ArgumentNullException.
Dim timeNow As Date = Date.Now
Try
    Dim easternZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
    Dim easternTimeNow As Date = TimeZoneInfo.ConvertTime(timeNow, TimeZoneInfo.Local, easternZone)
    Console.WriteLine("{0} {1} corresponds to {2} {3}.", _
                      timeNow, _
                      IIf(TimeZoneInfo.Local.IsDaylightSavingTime(timeNow), _
                          TimeZoneInfo.Local.DaylightName, TimeZoneInfo.Local.StandardName), _
                      easternTimeNow, _
                      IIf(easternZone.IsDaylightSavingTime(easternTimeNow), _
                          easternZone.DaylightName, easternZone.StandardName))
    ' Handle exception
    '
    ' As an alternative to simply displaying an error message, an alternate Eastern
    ' Standard Time TimeZoneInfo object could be instantiated here either by restoring
    ' it from a serialized string or by providing the necessary data to the
    ' CreateCustomTimeZone method.
Catch e As TimeZoneNotFoundException
    Console.WriteLine("The Eastern Standard Time Zone cannot be found on the local system.")
Catch e As InvalidTimeZoneException
    Console.WriteLine("The Eastern Standard Time Zone contains invalid or missing data.")
Catch e As SecurityException
    Console.WriteLine("The application lacks permission to read time zone information from the registry.")
Catch e As OutOfMemoryException
    Console.WriteLine("Not enough memory is available to load information on the Eastern Standard Time zone.")
    ' If we weren't passing FindSystemTimeZoneById a literal string, we also 
    ' would handle an ArgumentNullException.
End Try

Yöntemin TimeZoneInfo.FindSystemTimeZoneById tek parametresi, nesnenin özelliğine karşılık gelen, almak istediğiniz saat diliminin tanımlayıcısıdır TimeZoneInfo.Id . Saat dilimi tanımlayıcısı, saat dilimini benzersiz olarak tanımlayan bir anahtar alandır. Çoğu anahtar görece kısa olsa da saat dilimi tanımlayıcısı nispeten uzundur. Çoğu durumda değeri, saat diliminin StandardName standart saatinin adını sağlamak için kullanılan bir TimeZoneInfo nesnenin özelliğine karşılık gelir. Ancak, istisnalar vardır. Geçerli bir tanımlayıcı sağladığınızdan emin olmak için en iyi yol, sisteminizde kullanılabilen saat dilimlerini listelemek ve bu saat dilimlerinde bulunan saat dilimlerinin tanımlayıcılarını not almaktır. Çizim için bkz . Nasıl yapılır: Bilgisayarda mevcut saat dilimlerini numaralandırma. Yerel sistemde tanımlanan saat dilimlerini bulma makalesi, seçilen saat dilimi tanımlayıcılarının listesini de içerir.

Saat dilimi bulunursa, yöntemi nesnesini TimeZoneInfo döndürür. Saat dilimi bulunamazsa, yöntemi bir TimeZoneNotFoundExceptionoluşturur. Saat dilimi bulunur ancak verileri bozuk veya eksikse, yöntemi bir InvalidTimeZoneExceptionoluşturur.

Uygulamanız mevcut olması gereken bir saat dilimini kullanıyorsa, önce kayıt defterinden FindSystemTimeZoneById saat dilimi bilgilerini almak için yöntemini çağırmanız gerekir. Yöntem çağrısı başarısız olursa, özel durum işleyicinizin saat diliminin yeni bir örneğini oluşturması veya serileştirilmiş TimeZoneInfo bir nesneyi seri durumdan çıkararak yeniden oluşturması gerekir. Bir örnek için bkz . Nasıl yapılır: Katıştırılmış bir kaynaktan saat dilimlerini geri yükleme.

Ayrıca bkz.