2010-06-05 4 views
24

В базе данных я сохраняю все дату/время в UTC..NET Получить смещение временной зоны по часовому поясу

Я знаю имя часового пояса пользователя (например, «Восточное стандартное время США»).

Чтобы отобразить правильное время, я думал, что мне нужно добавить смещение часового пояса пользователя к дате/времени UTC. Но как мне получить смещение временной зоны по имени часового пояса?

Спасибо!

ответ

37

Вы можете использовать TimeZoneInfo.FindSystemTimeZoneById, чтобы получить TimeZoneInfo объект с помощью прилагаемого Id, затем TimeZoneInfo.GetUtcOffset от:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time"); 
TimeSpan offset = tzi.GetUtcOffset(myDateTime); 
+0

Это решило мою проблему. Спасибо! –

+0

Это, похоже, не работает для меня. В настоящее время это DST в зоне «E. Australia Standard Time», поэтому их время составляет GMT + 11. Однако, когда я запускаю это, я получаю результат 10 часов. Он должен быть 11. Код: TimeZoneInfo.FindSystemTimeZoneById («Стандартное время Австралии»). GetUtcOffset (Now.ToUniversalTime). Часы. Что я делаю не так? –

+0

@ component_15939 - Возможно, ничего плохого. Вы проверили, что компьютер, на котором работает, настроен на правильное использование DST? – Oded

4

Вы можете использовать способ TimeZoneInfo класса GetSystemTimeZones(), чтобы получить список всех часовых поясов, настроенных на вашем сервере, и сопоставить их со своим клиентом.

Хотя почему у вас есть часовые пояса в формате «Восточное стандартное время США»? Откуда это пришло?

+0

Отличная идея, будет попробовать его сейчас :) Я населяющих одну каплю вниз коллекции, возвращаемой GetSystemTimeZones() –

+0

Вместо заполнения падение вниз с Id/строка каждого объекта 'TimeZone' в коллекцию, почему бы не добавить фактические объекты вместо этого как 'Item's в раскрывающемся списке? Таким образом, когда выпадающее меню будет изменено, вы можете просто получить ссылку на объект TimeZoneInfo, используя '(TimeZoneInfo) myDropDown.SelectedItem'. Тогда вам не нужно будет каждый раз вызывать' .FindSystemTimeZoneById', вы уже имеете объект. –

2

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

var localizedDateTime = TimeZoneInfo.ConvertTime(yourDateTime, localTimeZoneInfo); 
+0

Отличный совет. –

Смежные вопросы