Преобразование времени из одного часового пояса в другой

Преобразование времени из одного часового пояса в другой

Обработка различий между часовыми поясами становится все более важной для всех приложений, которые работают с датами и временем. Приложение больше не может считать, что все значения времени могут быть выражены в местном времени, которое является временем, доступным в DateTime структуре. Например, веб-страница, которая отображает текущее время в восточной части США, будет содержать недостоверные сведения для пользователей в восточной Азии. В этом разделе объясняется, как преобразовать время из одного часового пояса в другой, а также как преобразовать DateTimeOffset значения с ограниченной поддержкой часовых поясов.

Преобразование во время в формате UTC

Время в формате UTC — это высокоточный, атомарный стандарт времени. Часовые пояса мира выражаются как положительные или отрицательные смещения относительно времени в формате UTC. Таким образом, время в формате UTC предоставляет тип времени, свободного от часовых поясов, или нейтрального времени часового пояса. Использование времени в формате UTC рекомендовано, когда важна совместимость даты и времени между компьютерами. (дополнительные сведения и другие рекомендации по датам и времени см. в разделе создание кода рекомендаций с использованием DateTime в платформа .NET Framework.) Преобразование отдельных часовых поясов в формат UTC упрощает сравнение времени.

Можно также сериализовать DateTimeOffset структуру для однозначного представления одного момента времени. Поскольку DateTimeOffset объекты хранят значение даты и времени вместе со смещением от времени в формате UTC, они всегда представляют определенный момент времени в связи с временем в формате UTC.

самый простой способ преобразовать время в формат UTC — вызвать static Shared метод (в Visual Basic) TimeZoneInfo.ConvertTimeToUtc(DateTime) . Точное преобразование, выполняемое методом, зависит от значения dateTime Kind Свойства параметра, как показано в следующей таблице.

DateTime.Kind Преобразование DateTimeKind.Local Преобразует местное время во время в формате UTC. DateTimeKind.Unspecified Предполагает, что параметр dateTime является местным временем и преобразовывает местное время в UTC. DateTimeKind.Utc Возвращает неизмененный параметр dateTime .

Следующий код преобразовывает текущее местное время во время в формате UTC и выводит результат на консоль.

Если значение даты и времени не представляет ни местное время, ни время в формате UTC, то, ToUniversalTime скорее всего, метод вернет ошибочный результат. Однако можно использовать TimeZoneInfo.ConvertTimeToUtc метод для преобразования даты и времени из указанного часового пояса. (Дополнительные сведения о получении TimeZoneInfo объекта, представляющего часовой пояс назначения, см. в разделе Поиск часовых поясов, определенных в локальной системе.) В следующем коде используется TimeZoneInfo.ConvertTimeToUtc метод для преобразования восточного стандартного времени в формат UTC.

Обратите внимание, что этот метод создает исключение, ArgumentException Если DateTime Kind свойство объекта и часовой пояс не совпадают. Несоответствие возникает, если Kind свойство имеет значение DateTimeKind.Local TimeZoneInfo , но объект не представляет местный часовой пояс, или если свойство имеет значение, Kind DateTimeKind.Utc но объект не TimeZoneInfo равен TimeZoneInfo.Utc .

Все эти методы принимают DateTime значения в качестве параметров и возвращают DateTime значение. Для DateTimeOffset значений DateTimeOffset структура имеет ToUniversalTime метод экземпляра, который преобразует дату и время текущего экземпляра в формат UTC. В следующем примере вызывается ToUniversalTime метод для преобразования местного времени и нескольких других значений времени в формат UTC.

Преобразование времени в формате UTC в заданный часовой пояс

Для преобразования времени в формате UTC в местное время см. следующий раздел "преобразование времени UTC в местное время". Для преобразования времени в формате UTC во время в любом назначенном часовом поясе вызовите ConvertTimeFromUtc метод. Этот метод принимает два параметра:

Время в формате UTC, которое требуется преобразовать. Это должно быть DateTime значение, свойство которого равно Kind Unspecified или Utc .

Часовой пояс, в который требуется преобразовать время в формате UTC.

Следующий код преобразует время в формате UTC в центральное стандартное время.

Преобразование времени в формате UTC в местное время

Для преобразования времени в формате UTC в местное время вызовите ToLocalTime метод DateTime объекта, время которого необходимо преобразовать. Точное поведение метода зависит от значения Kind свойства объекта, как показано в следующей таблице.

DateTime.Kind Преобразование DateTimeKind.Local Возвращает DateTime значение без изменений. DateTimeKind.Unspecified Предполагается, что DateTime значение равно UTC и ПРЕОБРАЗУЕТ UTC в местное время. DateTimeKind.Utc Преобразует DateTime значение в местное время.

TimeZone.ToLocalTimeМетод ведет себя идентично DateTime.ToLocalTime методу. Он принимает один параметр, который представляет собой значение даты и времени для преобразования.

можно также преобразовать время в любом заданном часовом поясе в местное время с помощью static Shared метода (в Visual Basic) TimeZoneInfo.ConvertTime . Этот метод рассматривается в следующем разделе.

Преобразование между любыми двумя часовыми поясами

преобразование между любыми двумя часовыми поясами можно выполнить с помощью любого из следующих двух static Shared методов (в Visual Basic) TimeZoneInfo класса:

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

Параметры этого метода — это значение даты и времени для преобразования, идентификатор часового пояса значения даты и времени и идентификатор часового пояса, в который необходимо преобразовать значение даты и времени.

Для обоих методов требуется, Kind чтобы свойство значения даты и времени было преобразовано, а TimeZoneInfo объект или идентификатор часового пояса, представляющий его часовой пояс, соответствовал друг другу. В противном случае возникает исключение ArgumentException. Например, если Kind свойство значения даты и времени равно DateTimeKind.Local , возникает исключение, если TimeZoneInfo объект, переданный в качестве параметра в метод, не равен TimeZoneInfo.Local . Исключение также создается, если идентификатор, переданный в качестве параметра в метод, не равен TimeZoneInfo.Local.Id .

В следующем примере используется ConvertTime метод для преобразования из Гавайского стандартного времени в местное время.

Преобразование значений DateTimeOffset

Значения даты и времени, представленные DateTimeOffset объектами, не имеют полной осведомленности о часовых поясах, так как объект не связан с часовым поясом во время создания экземпляра. Однако во многих случаях приложению достаточно преобразовать дату и время на основе двух различных значений смещения относительно времени в формате UTC, а не на основе времени конкретных часовых поясов. Чтобы выполнить это преобразование, можно вызвать метод текущего экземпляра ToOffset . Единственным параметром метода является смещение нового значения даты и времени, возвращаемого методом.

Например, если дата и время запроса пользователя к веб-странице известны и сериализованы в виде строки в формате мм/дд/гггг чч:мм:сс zzzz, то следующий метод ReturnTimeOnServer преобразует это значение даты и времени в значение даты и времени на веб-сервере.

Если методу передается строка "9/1/2007 5:32:07 -05:00", которая представляет дату и время в часовом поясе, который раньше пояса UTC на пять часов, он возвращает строку "9/1/2007 3:32:07 -07:00" для сервера, расположенного в тихоокеанском стандартном часовом поясе США.

📎📎📎📎📎📎📎📎📎📎