Я пытался использовать 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 , появляющегося в первую очередь. Есть идеи?