Instrukcje: uzyskiwanie obiektu TimeZoneInfo
Najczęstszym sposobem uzyskania TimeZoneInfo obiektu jest pobranie informacji o nim z rejestru. Aby uzyskać obiekt, wywołaj metodę static
(Shared
w Visual Basic), TimeZoneInfo.FindSystemTimeZoneById która wygląda w rejestrze. Obsługa wszelkich wyjątków zgłaszanych przez metodę, szczególnie TimeZoneNotFoundException zgłaszanych, jeśli strefa czasowa nie jest zdefiniowana w rejestrze.
Uwaga
Począwszy od platformy .NET 8, TimeZoneInfo.FindSystemTimeZoneById zwraca buforowany TimeZoneInfo obiekt zamiast tworzenia wystąpienia nowego obiektu. Aby uzyskać więcej informacji, zobacz FindSystemTimeZoneById nie zwraca nowego obiektu.
Przykład
Poniższy kod pobiera obiekt reprezentujący wschodnią strefę TimeZoneInfo czasową (standardowy) i wyświetla wschodni czas standardowy odpowiadający czasowi lokalnemu.
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
Pojedynczy TimeZoneInfo.FindSystemTimeZoneById parametr metody jest identyfikatorem strefy czasowej, którą chcesz pobrać, która odpowiada właściwości obiektu TimeZoneInfo.Id . Identyfikator strefy czasowej to pole klucza, które jednoznacznie identyfikuje strefę czasową. Chociaż większość kluczy jest stosunkowo krótka, identyfikator strefy czasowej jest stosunkowo długi. W większości przypadków jego wartość odpowiada StandardName właściwości TimeZoneInfo obiektu, która jest używana do podania nazwy czasu standardowego strefy czasowej. Występują jednak pewne wyjątki. Najlepszym sposobem upewnienia się, że podasz prawidłowy identyfikator, jest wyliczenie stref czasowych dostępnych w systemie i zanotowanie identyfikatorów znajdujących się na nich stref czasowych. Aby zapoznać się z ilustracją, zobacz How to: Enumerate time zones present on a computer (Instrukcje: wyliczanie stref czasowych znajdujących się na komputerze). Artykuł Znajdowanie stref czasowych zdefiniowanych w systemie lokalnym zawiera również listę wybranych identyfikatorów strefy czasowej.
Jeśli strefa czasowa zostanie znaleziona, metoda zwróci jej TimeZoneInfo obiekt. Jeśli strefa czasowa nie zostanie znaleziona, metoda zgłasza błąd TimeZoneNotFoundException. Jeśli strefa czasowa zostanie znaleziona, ale jej dane są uszkodzone lub niekompletne, metoda zgłasza błąd InvalidTimeZoneException.
Jeśli aplikacja opiera się na strefie czasowej, która musi być obecna, należy najpierw wywołać metodę FindSystemTimeZoneById , aby pobrać informacje o strefie czasowej z rejestru. Jeśli wywołanie metody zakończy się niepowodzeniem, program obsługi wyjątków powinien utworzyć nowe wystąpienie strefy czasowej lub utworzyć je ponownie, deserializując serializowany TimeZoneInfo obiekt. Zobacz Instrukcje: przywracanie stref czasowych z osadzonego zasobu , aby zapoznać się z przykładem.