.NET конвертирует дату и время в UTC с учетом часового пояса

Используя С#, мне нужно преобразовать входящие значения datetime в UTC. Я знаю, что для этих преобразований есть функциональность в .NET, но все, что мне нужно для определения часового пояса, - это стандартный список часовых поясов

http://www.timegenie.com/timezones

Какой лучший способ сделать это в .NET? Мне нужно создать таблицу сопоставления для преобразования часовых поясов в идентификаторы в TimeZoneInfo.GetSystemTimeZones() (например, "Стандартное тихоокеанское время (Мексика)" ) так что я могу использовать TimeZoneInfo.FindSystemTimeZoneById()?

Спасибо за любую помощь

Ответ 1

Я делал это раньше, сохраняя идентификатор часового пояса в базе данных, используя таблицу сопоставления. т.е. таблица, содержащая результаты TimeZone.GetSystemTimeZones()

Фактически вам не нужно использовать TimeZoneInfo.FindSystemTimeZoneById(): вы можете выполнить преобразование, используя одну из перегрузок TimeZoneInfo.ConvertTimeBySystemTimeZoneId(). Этот метод имеет некоторые перегрузки, которые принимают значения DateTime, и некоторые, которые принимают значения DateTimeOffset (что предпочтительнее, поскольку они указывают однозначный момент времени).

например.

TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.Now, "New Zealand Standard Time", "UTC")

Реальная польза от использования идентификатора часового пояса системы, а не смещения, хранящегося в базе данных, заключается в том, что переход на летнее время автоматически выполняется для вас с помощью TimeZoneInfo.ConvertTimeBySystemTimeZoneId.

Ответ 2

В MSDN имеется много информации о преобразовании в разные часовые пояса.

Вероятно, вы захотите использовать метод ConvertTimeBySystemTimeZoneId (см. ссылку для примеров).