Использование TimeZoneInfo для преобразования между UTC / указанным TimeZone не работает - PullRequest
1 голос
/ 14 октября 2011

Все наши данные даты / времени в нашей базе данных хранятся в формате UTC. Я пытаюсь написать функцию для преобразования этого времени UTC в предпочтительный часовой пояс пользователя (они могут выбрать свой часовой пояс в своем профиле, поэтому он НИЧЕГО не имеет ничего общего с локальными настройками на своем компьютере и всем, что связано с выбранным часовым поясом. из выпадающего списка доступных вариантов.

Эта функция находится в контексте события DevExpress AspxGridView (сторонний элемент управления не имеет отношения к вопросу, но я подумал, что упомяну это):

DateTimeOffset utcTime = (DateTimeOffset)e.Value;

TimeZoneInfo destTimeZone = Helper.GetTimeZoneInfo();

DateTime modifiedDate = TimeZoneInfo
    .ConvertTimeFromUtc(utcTime.DateTime, destTimeZone);

e.DisplayText = String.Format("{0} {1}", 
                              modifiedDate.ToString("g"), 
                              destTimeZone.Abbreviation());

Helper.GetTimeZoneInfo() просто возвращает класс TimeZoneInfo, соответствующий классу, выбранному пользователем, или по умолчанию «Тихоокеанское стандартное время», если он не выбрал один.

Обычно это работает нормально, пока я не переключу системные часы (на которых работает этот сервер) с сегодняшнего дня (14 октября, дата перехода на летнее время) на что-то вроде 11 января, что не летнее время.

Время, кажется, всегда отображается в летнее время (то есть всегда смещение на 7 часов). Независимо от того, что я делаю со своими системными часами, я не могу настроить время на дополнительный час.

Например, когда для моего часового пояса установлено тихоокеанское стандартное время, для времени UTC 10-10-2011 20:00:00 это всегда , отображающее это время:

10-10-2011 13:00:00 (время перехода на летнее время, смещение -7).

В нерабочее время (стандартное) время должно быть:

10-10-2011 12:00:00 (смещение -8).

Чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 14 октября 2011

Преобразованное местное время в формате UTC всегда основывается на информации о часовом поясе для того времени в UTC ... не для того, каким будет текущее время.

То есть смещение PST на 10 октября 2011 г. UTC составляет всегда -7. Неважно, в какую дату вы выполняете конверсию.

... Или я неправильно понимаю, что вы спрашиваете?

0 голосов
/ 14 октября 2011

Возможно, вы посмотрите на e.Value .

Для DateTimeKind для него установлено значение DateTimeKind.Utc или DateTimeKind.Unspecified

Если оно Не указано преобразование не будет работать правильно.

Невозможно установить тип напрямую.Лучшее, что я придумал, это что-то вроде

// the value off the DB, but Kind is unspecified
var fromDb = new DateTime(1999,31,12)         

// convert it to a Utc version of the same date
var fromDbInUtc = new DateTime(fromDb.Ticks, DateTimeKind.Utc)

var destTimeZone = Helper.GetTimeZoneInfo();     

var local = TimeZoneInfo.ConvertFromUtc(fromDbInUtc, destTimeZone);  

Надеюсь, это поможет,

Алан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...