Поделиться через


Практическое руководство. Доступ к предопределенным объектам UTC и объектам местных часовых поясов

Класс TimeZoneInfo предоставляет два свойства: Utc и Local, которые обеспечивают вашему коду доступ к предопределенным объектам часового пояса. В этом разделе рассматривается порядок работы с объектами TimeZoneInfo, возвращаемыми этими свойствами.

Для получения доступа к объекту TimeZoneInfo (Всемирного координированного времени, UTC)

  1. static Используйте свойство (Shared в Visual Basic) TimeZoneInfo.Utc для доступа к согласованному всемирному времени.

  2. Вместо того чтобы присваивать объект TimeZoneInfo, возвращаемый свойством, переменной объекта, продолжайте доступ к всемирному координированному времени через свойство TimeZoneInfo.Utc.

Доступ к местному часовому поясу

  1. Используйте свойство static (Shared в Visual Basic) TimeZoneInfo.Local для доступа к часовому поясу локальной системы.

  2. Вместо того чтобы присваивать объект TimeZoneInfo, возвращаемый свойством, переменной объекта, продолжайте получать доступ к локальному часовому поясу через свойство TimeZoneInfo.Local.

Пример

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

// Create Eastern Standard Time value and TimeZoneInfo object
DateTime estTime = new DateTime(2007, 1, 1, 00, 00, 00);
string timeZoneName = "Eastern Standard Time";
try
{
    TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);

    // Convert EST to local time
    DateTime localTime = TimeZoneInfo.ConvertTime(estTime, est, TimeZoneInfo.Local);
    Console.WriteLine("At {0} {1}, the local time is {2} {3}.",
            estTime,
            est,
            localTime,
            TimeZoneInfo.Local.IsDaylightSavingTime(localTime) ?
                      TimeZoneInfo.Local.DaylightName :
                      TimeZoneInfo.Local.StandardName);

    // Convert EST to UTC
    DateTime utcTime = TimeZoneInfo.ConvertTime(estTime, est, TimeZoneInfo.Utc);
    Console.WriteLine("At {0} {1}, the time is {2} {3}.",
            estTime,
            est,
            utcTime,
            TimeZoneInfo.Utc.StandardName);
}
catch (TimeZoneNotFoundException)
{
    Console.WriteLine("The {timeZoneName} zone cannot be found in the registry.");
}
catch (InvalidTimeZoneException)
{
    Console.WriteLine("The registry contains invalid data for the {timeZoneName} zone.");
}

// The example produces the following output to the console:
//    At 1/1/2007 12:00:00 AM (UTC-05:00) Eastern Time (US & Canada), the local time is 1/1/2007 12:00:00 AM Eastern Standard Time.
//    At 1/1/2007 12:00:00 AM (UTC-05:00) Eastern Time (US & Canada), the time is 1/1/2007 5:00:00 AM UTC.

' Create Eastern Standard Time value and TimeZoneInfo object      
Dim estTime As Date = #01/01/2007 00:00:00#
Dim timeZoneName As String = "Eastern Standard Time"
Try
    Dim est As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName)

    ' Convert EST to local time
    Dim localTime As Date = TimeZoneInfo.ConvertTime(estTime, est, TimeZoneInfo.Local)
    Console.WriteLine("At {0} {1}, the local time is {2} {3}.", _
            estTime, _
            est, _
            localTime, _
            IIf(TimeZoneInfo.Local.IsDaylightSavingTime(localTime), _
                TimeZoneInfo.Local.DaylightName, _
                TimeZoneInfo.Local.StandardName))

    ' Convert EST to UTC
    Dim utcTime As Date = TimeZoneInfo.ConvertTime(estTime, est, TimeZoneInfo.Utc)
    Console.WriteLine("At {0} {1}, the time is {2} {3}.", _
            estTime, _
            est, _
            utcTime, _
            TimeZoneInfo.Utc.StandardName)
Catch e As TimeZoneNotFoundException
    Console.WriteLine("The {0} zone cannot be found in the registry.", _
                      timeZoneName)
Catch e As InvalidTimeZoneException
    Console.WriteLine("The registry contains invalid data for the {0} zone.", _
                      timeZoneName)
End Try

Вы всегда должны обращаться к местному часовом поясу через TimeZoneInfo.Local свойство, а не назначать локальный часовой пояс переменной TimeZoneInfo объекта. Аналогичным образом следует всегда обращаться к координированному универсальному времени через TimeZoneInfo.Utc свойство, а не назначать зону UTC переменной TimeZoneInfo объекта. Это предотвращает переменную объекта TimeZoneInfo от недопустимого состояния вызовом метода TimeZoneInfo.ClearCachedData.

См. также