Sdílet prostřednictvím


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 pokud TimeZoneNotFoundException časové pásmo není 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. Hledání časových pásem definovaných v článku místního systému obsahuje také 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 Postupy: Obnovení časových pásem z vloženého prostředku , například.

Viz také