Postupy: Získání objektu TimeZoneInfo

Nejběžnějším způsobem získání objektu TimeZoneInfo je načtení informací o objektu z registru. Chcete-li získat objekt, zavolejte static (Shared v jazyce Visual Basic) TimeZoneInfo.FindSystemTimeZoneById metoda, která hledá v registru. Zpracujte všechny výjimky vyvolané metodou, zejména výjimku TimeZoneNotFoundException, která je vyvolána, pokud není časové pásmo definováno v registru.

Poznámka:

Počínaje rozhraním .NET 8 TimeZoneInfo.FindSystemTimeZoneById vrátí objekt uložený TimeZoneInfo v mezipaměti místo vytvoření instance nového objektu. Další informace naleznete v tématu FindSystemTimeZoneById nevrací nový objekt.

Příklad

Následující kód načte TimeZoneInfo objekt, který představuje východní standardní časové pásmo a zobrazí čas východního standardního času, který odpovídá místnímu času.

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

Jediný TimeZoneInfo.FindSystemTimeZoneById parametr metody je identifikátor časového pásma, které chcete načíst, což odpovídá vlastnosti objektu TimeZoneInfo.Id . Identifikátor časového pásma je klíčové pole, které jednoznačně identifikuje časové pásmo. I když je většina klíčů relativně krátká, identifikátor časového pásma je poměrně dlouhý. Ve většině případů jeho hodnota odpovídá StandardName vlastnosti objektu TimeZoneInfo , která se používá k zadání názvu standardního času časového pásma. Existuje však několik výjimek. Nejlepším způsobem, jak zajistit, že zadáte platný identifikátor, je vytvořit výčet časových pásem dostupných ve vašem systému a poznamenejte si identifikátory časových pásem, které jsou na nich přítomné. Obrázek najdete v tématu Postupy: Vytvoření výčtu časových pásem, které jsou přítomné na počítači. Článek Hledání časových pásem definovaných na místním systému také obsahuje seznam vybraných identifikátorů časového pásma.

Pokud se najde časové pásmo, vrátí metoda jeho TimeZoneInfo objekt. Pokud se časové pásmo nenajde, metoda vyvolá TimeZoneNotFoundExceptionchybu . Pokud se časové pásmo najde, ale jeho data jsou poškozena nebo neúplná, metoda vyvolá InvalidTimeZoneExceptionvýjimku.

Pokud vaše aplikace spoléhá na časové pásmo, které musí existovat, měli byste nejprve volat metodu FindSystemTimeZoneById pro načtení informací o časovém pásmu z registru. Pokud volání metody selže, obslužná rutina výjimky by měla buď vytvořit novou instanci časového pásma, nebo ji znovu vytvořit deserializací serializovaného TimeZoneInfo objektu. Viz například Obnovení časových pásem z vloženého prostředku.

Viz také