Отображение часовых поясов в WPF / C #. Откройте для себя смещение летнего времени

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

Я использую .NET 3.5 (слава богу), но меня это все еще сбивает с толку.

Спасибо

РЕДАКТИРОВАТЬ: Дополнительная информация: этот вопрос предназначался для использования в среде приложения WPF. Фрагмент кода, который я оставил ниже, продвинул пример ответа на шаг дальше, чтобы получить именно то, что я искал.


person discorax    schedule 22.10.2008    source источник
comment
Просто подумал, что должен указать, что это не имеет ничего общего с WPF, поэтому вы можете удалить это из заголовка / описания / тегов.   -  person PeterAllenWebb    schedule 22.10.2008
comment
На самом деле, мои вопросы касались использования в приложении WPF, как вы можете видеть из моего ответа ниже. Хотя это код .NET, WPF - это последнее применение, поэтому оставленный ниже фрагмент кода - C # для WPF.   -  person discorax    schedule 22.10.2008
comment
-1. Пожалуйста, улучшите заголовок, 50% из них избыточны. Каждый вопрос SO потенциально может начинаться с «Кто-нибудь работал с X?». Принятый ответ: Да, кое-кто с ним работал.   -  person dbkk    schedule 29.09.2009


Ответы (2)


Вот фрагмент кода на C #, который я использую в своем приложении WPF. Это даст вам текущее время (с поправкой на летнее время) для указанного вами идентификатора часового пояса.

// _timeZoneId is the String value found in the System Registry.
// You can look up the list of TimeZones on your system using this:
// ReadOnlyCollection<TimeZoneInfo> current = TimeZoneInfo.GetSystemTimeZones();
// As long as your _timeZoneId string is in the registry 
// the _now DateTime object will contain
// the current time (adjusted for Daylight Savings Time) for that Time Zone.
string _timeZoneId = "Pacific Standard Time";
DateTime startTime = DateTime.UtcNow;
TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById(_timeZoneId);
_now = TimeZoneInfo.ConvertTime(startTime, TimeZoneInfo.Utc, tst);

Это фрагмент кода, который у меня получился. Спасибо за помощь.

person discorax    schedule 22.10.2008

Вы можете использовать DateTimeOffset для получения смещения UTC, поэтому вам не нужно копаться в реестре для получения этой информации.

TimeZone.CurrentTimeZone возвращает дополнительные данные о часовом поясе, а TimeZoneInfo.Local содержит метаданные о часовом поясе (например, поддерживает ли он летнее время, названия его различных состояний и т. Д.).

Обновление: я думаю, что это конкретно отвечает на ваш вопрос:

var tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var dto = new DateTimeOffset(2008, 10, 22, 13, 6, 0, tzi.BaseUtcOffset);
Console.WriteLine(dto);
Console.ReadLine();

Этот код создает DateTime со смещением -8. Установленные по умолчанию часовые пояса перечислены в MSDN.

person cfeduke    schedule 22.10.2008
comment
DateTimeOffset, TimeZone и TimeZoneInfo - это типы значений, доступные в версии 3.0, извините, это не совсем ясно в моем ответе. - person cfeduke; 22.10.2008
comment
если вы создаете новый объект DateTime, можете ли вы установить его часовой пояс? Вот где у меня болит мозг. Насколько я понимаю, что может быть неверным, TimeZone.CurrentTimeZone возвращает информацию о часовом поясе для локального компьютера, но его нельзя установить в другую зону. Собираюсь в MSDN копать глубже. Спасибо - person discorax; 22.10.2008
comment
Да, вы можете, я обновил ответ кодом, в котором я подтвердил, что это работает. - person cfeduke; 22.10.2008
comment
Этот код создает DateTime ... должен быть Этот код создает DateTimeOffset ... Также это решение не учитывает летнее время. TimeZoneInfo.ConvertTime проверит, находится ли время в диапазоне летнего времени, и настроится автоматически. - person Mike Blandford; 18.06.2009