Практическое руководство. Получение объекта TimeZoneInfo

Наиболее распространенным способом получения объекта является получение сведений TimeZoneInfo об этом из реестра. Чтобы получить объект, вызовите static метод (Shared в Visual Basic), TimeZoneInfo.FindSystemTimeZoneById который выглядит в реестре. Обработка исключений, создаваемых методом, в частности TimeZoneNotFoundException , возникает, если часовой пояс не определен в реестре.

Примечание.

Начиная с .NET 8, TimeZoneInfo.FindSystemTimeZoneById возвращает кэшированный TimeZoneInfo объект вместо создания экземпляра нового объекта. Дополнительные сведения см. в разделе FindSystemTimeZoneById, который не возвращает новый объект.

Пример

Следующий код извлекает объект TimeZoneInfo , который представляет часовой пояс восточного времени США, и отображает время в этом поясе, соответствующее местному времени.

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

Единственный параметр метода TimeZoneInfo.FindSystemTimeZoneById — идентификатор часового пояса, который необходимо получить и который соответствует свойству TimeZoneInfo.Id объекта. Идентификатор часового пояса — это важнейшее поле, которое уникально идентифицирует часовой пояс. Несмотря на то что большинство ключей являются относительно короткими, идентификатор часового пояса относительно длинный. В большинстве случаев его значение соответствует свойству StandardName объекта TimeZoneInfo , которое используется для предоставления имени стандартного времени часового пояса. Однако есть исключения. Лучше всего гарантировать, что передается действительный идентификатор, путем перечисления доступных в системе часовых поясов и отслеживания присутствующих в них идентификаторов часовых поясов. Пример см. в разделе How to: Enumerate time zones present on a computer. Поиск часовых поясов, определенных в статье о локальной системе , также содержит список выбранных идентификаторов часовых поясов.

Если часовой пояс найден, метод возвращает его объект TimeZoneInfo . Если часовой пояс не найден, метод создает TimeZoneNotFoundException. Если часовой пояс найден, но его данные повреждены или неполны, метод создает InvalidTimeZoneException.

Если приложение зависит от наличия часового пояса, необходимо сначала вызвать метод FindSystemTimeZoneById для извлечения сведений о часовом поясе из реестра. Если вызов метода завершится сбоем, обработчик исключений должен создать новый экземпляр часового пояса или повторно создать его путем десериализации сериализованного объекта TimeZoneInfo . Пример см. в статье "Практическое руководство. Восстановление часовых поясов из внедренного ресурса ".

См. также