GetSystemTimeZones отсутствует стандартное время по Гринвичу - PullRequest
8 голосов
/ 09 марта 2012

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

Когда я смотрю в реестре, я обнаруживаю, что Стандартное время по Гринвичу имеет подключ Динамический 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 возвращает false, TryGetTimeZoneByRegistryKey создает исключение InvalidTimeZoneException, что означает, что Стандартное время по Гринвичу не добавляется в коллекцию часовых поясов. Я пытался удалить пустые подключи Dynamic DST , но что-то снова добавляет их (возможно, Windows Update).

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

Ответы [ 3 ]

1 голос
/ 27 апреля 2012

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

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

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

1 голос
/ 26 апреля 2012

Полагаю, это просто проблема с реестром.

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

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

0 голосов
/ 26 апреля 2012

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

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

Отсутствие поддержки Windows 7 для GMT

Преобразование UTC в GMT

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...