Практическое руководство. Получение объекта 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 объекта, которое используется для предоставления имени стандартного времени часового пояса. Однако есть исключения. Лучший способ убедиться, что вы указали допустимый идентификатор, — перечислить часовые пояса, доступные в вашей системе, и заметить идентификаторы часовых поясов, присутствующих на них. Иллюстрация см. в разделе "Практическое руководство. Перечисление часовых поясов, присутствующих на компьютере". Статья Определение часовых поясов, заданных в локальной системе также содержит список выбранных идентификаторов часовых поясов.

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

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

См. также