2012-03-09 3 views
8

Я пытаюсь использовать TimeZoneInfo.GetSystemTimeZones в .net4, чтобы заменить наш старый метод, который использует COM для вызова некоторого кода MFC. Однако мне пришлось вернуться к методу COM, потому что GetSystemTimeZones не возвращает все часовые пояса. Проблема заключается в том, что в нашем списке вариантов, основанных в Великобритании, а не в стандартном времени GMT в нашем списке вариантов.GetSystemTimeZones отсутствует GMT Стандартное время

Когда я смотрю в реестре, я считаю, что GMT Standard Time имеет Dynamic DST подключ без правил, определенных. Я загрузил исходный код .net4 и, в TimeZoneInfo.cs, GetSystemTimeZones в конечном итоге вызывает TryCreateAdjustmentRules, который, как представляется, возвращает false, если ключ Dynamic DST не имеет определенных параметров FirstEntry или LastEntry.

  // 
      // loop over all of the "<time_zone_name>\Dynamic DST" hive entries 
      // 
      // read FirstEntry {MinValue  - (year1, 12, 31)} 
      // read MiddleEntry {(yearN, 1, 1) - (yearN, 12, 31)} 
      // read LastEntry {(yearN, 1, 1) - MaxValue  } 

      // read the FirstEntry and LastEntry key values (ex: "1980", "2038") 
      Int32 first = (Int32)dynamicKey.GetValue(c_firstEntryValue, -1, RegistryValueOptions.None); 
      Int32 last = (Int32)dynamicKey.GetValue(c_lastEntryValue, -1, RegistryValueOptions.None); 

      if (first == -1 || last == -1 || first > last) { 
       rules = null; 
       return false; 
      } 

Как TryCreateAdjustmentRules возвращает ложь, TryGetTimeZoneByRegistryKey бросает InvalidTimeZoneException что означает GMT Standard Time не добавляется в коллекцию часового пояса. Я попытался удалить пустые Dynamic DST, но что-то добавляет их обратно (возможно, Windows Update).

Я сделал много поиска, но не видел, чтобы кто-либо еще сообщал об этой проблеме. Я не уверен, есть ли исправление GetSystemTimeZones или я могу остановить пустой раздел Dynamic DST. Есть идеи?

+0

Это очень странно - «GMT Стандартное время» определенно вернулось для меня. Не могли бы вы опубликовать код, который вы используете, чтобы определить, что он отсутствует? Это, наверное, хорошо, но поскольку мы видим нечетные результаты ... –

+0

Ненавижу говорить об этом, но он работает в моей системе, я в Великобритании, и я вижу «GMT Standard Time» в возвращаемых 101 значениях. Вы пробовали это в другой системе? – Lazarus

+0

Jon, имеет ли ваш раздел времени GMT GMT Time пустой пусковой раздел DST? –

ответ

1

Оказалось, что проблема связана с нашим COM-объектом, а не с кодом .NET. Код для чтения реестра должен только читать, но он ошибочно вызывает RegCreateKey для оптимизации нескольких вызовов в той же ветке реестра.

Когда объект COM зарегистрирован (с правами администратора) из-за новой версии, он загружает временные зоны и создает Dynamic DST для локального часового пояса, который в моем случае является GMT/UTC.

Администраторы, я думаю, этот вопрос должен быть помечен для удаления.

+0

Ах, ха! Так что это был COM-объект! : D – dyslexicanaboko

1

Я предполагаю, что это вопрос реестра.

Что-то подобное описано здесь для WinXP/Server 2003 SP1. Пожалуйста, смотрите, если следующие помогает: http://blogs.technet.com/b/dst2007/archive/2007/03/06/missing-time-zones-in-registry.aspx

Я думаю, вы могли бы экспортировать весь ключ реестра от другой машины, и применить его к проблемным коробкам (а).

+0

Моя проблема в том, что я могу избавиться от подраздела _Dynamic DST_, удалив его в редакторе реестра, и реестр выглядит нормально. В какой-то более поздний момент ключ снова появляется, но это может быть несколько дней спустя. Я просто не знаю, что заставляет его снова появляться. Я попробую использовать regmon на тестовом сервере, чтобы узнать, дает ли это какие-либо подсказки. –

0

Просмотрев эту проблему и даже выполнив код, указанный вами в комментариях, чтобы распечатать список часовых поясов, я не могу получить GMT, чтобы отображаться в моей системе. Я запускаю Windows 7 Professional и выбор GMT - это просто не вариант. Я знаю, что это не решает вашу проблему, и вы, как и многие другие, выглядите так, как будто вам действительно нужно, чтобы это работало с GMT.

Однако, если это вообще возможно, если вы видите способ использовать UTC, то я хотел бы проверить эти ссылки:

Windows 7 Lack of Support for GMT

Converting UTC to GMT

Просто еще один возможный ответ на вашу проблему, есть в любом случае вы можете создать обертку вокруг значений UTC для отображения GMT? Я спрашиваю, потому что эта проблема не кажется, что она скоро исчезнет. Даже если вы заработаете сейчас - в будущем он может снова сломаться. Если я придумаю метод для этого, я обновлю свой ответ.

+0

Спасибо за ваш ответ, но позвольте мне уточнить. Ключ в реестре: _GMT Standard Time_ (часовой пояс Великобритании), но текст отображения в списке часовых поясов - _ (UTC) Дублин, Эдинбург, Лиссабон, Лондон_. UTC и GMT - это два имени для одного и того же, Windows 2003 отображает GMT, а в 2008 отображается UTC. –

+1

Это длинный снимок, но вы пробовали переустановить свой COM-объект, чтобы проверить, не остановит ли этот ключ подтверждение? – dyslexicanaboko

+0

Мне нужен мой COM-объект для других функций. Насколько мне известно, это только чтение из этой ветви реестра. Теперь у меня есть Process Monitor, смотрящий на реестр, чтобы попытаться зарегистрировать, кто его воссоздает. –

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