Практическое руководство. Создание экземпляра объекта TimeZoneInfo
Наиболее распространенным способом создания экземпляра объекта класса TimeZoneInfo является извлечение сведений о нем из реестра. В этом разделе описываются способы создания экземпляра объекта TimeZoneInfo по данным из локального системного реестра.
Создание экземпляра объекта TimeZoneInfo
Объявите объект TimeZoneInfo.
Вызовите метод TimeZoneInfo.FindSystemTimeZoneById c модификатором static (Shared в языке Visual Basic).
Обработайте все исключения, создаваемые методом, в частности, исключение TimeZoneNotFoundException, которое создается в случае, если указанный часовой пояс в реестре не определен.
Пример
В приведенном ниже коде создается объект TimeZoneInfo, соответствующий часовому поясу стандартного восточного времени США, и отображается стандартное восточное время США, соответствующее местному времени.
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
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.
Единственный параметр метода TimeZoneInfo.FindSystemTimeZoneById — это соответствующий свойству объекта TimeZoneInfo.Id идентификатор часового пояса, который необходимо получить. Идентификатор часового пояса является ключевым полем, которое однозначно определяет часовой пояс. Идентификатор часового пояса достаточно длинный в то время как большинство ключей являются относительно короткими. В большинстве случаев его значение соответствует свойству StandardName объекта TimeZoneInfo, которое используется для получения названия стандартного времени часового пояса. Однако есть и исключения. Лучшим способом удостовериться, что используется допустимый идентификатор, является перечисление часовых поясов, представленных в системе, и проверка наличия у них идентификаторов часовых поясов. Пример см. в разделе Практическое руководство. Перечисление присутствующих на компьютере часовых поясов. В разделе Поиск часового пояса, заданного в локальной системе также представлен список избранных идентификаторов часовых поясов.
Если часовой пояс найден, то метод возвращает соответствующий ему объект TimeZoneInfo. Если часовой пояс не найден, то метод создает исключение TimeZoneNotFoundException. Если часовой пояс найден, но его данные повреждены или неполны, то метод создает исключение InvalidTimeZoneException.
Если работа приложения зависит от доступности определенного часового пояса, то для получения сведений о часовом поясе из реестра сначала следует вызвать метод FindSystemTimeZoneById. Если при вызове метода произошла ошибка, то обработчик исключений должен создать новый экземпляр часового пояса или восстановить его путем десериализации сериализованного объекта TimeZoneInfo. Пример см. в разделе Практическое руководство. Восстановление часовых поясов из внедренного ресурса.
Компиляция кода
Для этого примера требуется:
Чтобы ссылка на System.Core.dll была добавлена в проект.
Чтобы пространство имен System было импортировано с помощью оператора using (обязательно в коде C#).
См. также
Задачи
Основные понятия
Поиск часового пояса, заданного в локальной системе