Применить смещение DateTime к восточному часовому поясу США - PullRequest
1 голос
/ 04 апреля 2011

У меня есть страница, которая генерирует файлы vCal и iCal для импорта событий в Outlook и iCal. Эти почтовые клиенты (Outlook & iCal) будут принимать даты в формате UTC, поскольку они знают смещение пользователя и будут обрабатывать ввод в нужное время. Наш клиент, для которого мы пишем этот код, базируется в восточном часовом поясе США, и я тоже. Их хост находится в центральном часовом поясе (на 1 час позади восточного). Я хотел бы, чтобы код обрабатывал это без каких-либо жестко закодированных смещений. Мой код в настоящее время получает DateTime из нашей CMS и преобразуется в UTC для Outlook / iCal. Это означает, что значение DateTime из CMS относительно местоположения хостинга:

// Start Date Time
sb.AppendFormat("DTSTART:{0}\n", thisEvent.StartDate.ToUniversalTime().ToString("yyyyMMddTHHmmssZ"));

Когда я запускаю это на своем локальном компьютере, все нормально, потому что DateTime в CMS основан на восточном часовом поясе нашего клиента, и я тоже, поэтому процесс происходит в восточном направлении -> UTC -> в Outlook, который затем переходит в UTC -> Восточный, и все хорошо. Когда я развертываюсь на сервере в Central, DateTime из CMS находится в часе езды от Eastern. Как я могу автоматически получить смещение от восточного и добавить его до того, как преобразовать в UTC? Мне, очевидно, нужно это для обработки как стандартного времени (EST), так и летнего времени (EDT). Я хотел бы сделать это программно без жестко запрограммированных значений, чтобы он всегда работал правильно, независимо от того, в каком часовом поясе вы находитесь. если я передам этот код кому-то для разработки в Индии, он должен автоматически обработать смещение локального сервера и соответственно изменить его.

Мне нужно сделать что-то вроде этого, где я применяю смещение к восточному времени перед преобразованием в UTC:

sb.AppendFormat("DTSTART:{0}\n", thisEvent.StartDate.ApplyEasternOffset().ToUniversalTime().ToString("yyyyMMddTHHmmssZ"));

Извините, если это тема, которая обсуждалась ранее, я просто не уверен в лучших терминах для поиска такого вопроса. Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 04 апреля 2011

Проверьте класс TimeZoneInfo. У него есть методы для получения смещений UTC для любого часового пояса.

http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx

Кроме того, посмотрите этот предыдущий пост: Как использовать TimeZoneInfo для получения местного времени в летнее время?

Вот пример, показывающий преобразование из Pacfic в Eastern:

var eastern = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var local = TimeZoneInfo.Local; // PDT for me
Console.WriteLine(DateTime.Now.Add(eastern.BaseUtcOffset - local.BaseUtcOffset));

Показывает 04.04.2011 12:05:31, когда мои местные часы показывают 9: 05: 31.

6 голосов
/ 04 апреля 2011

Вы можете использовать TimeZoneInfo Класс.

Взгляните на этот образец:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time");
TimeSpan offset = tzi.GetUtcOffset(DateTime.Now);

DateTime testDateTime = DateTime.Now.Add(offset);
...