Почему некоторые часовые пояса, возвращаемые GetSystemTimeZones, не найдены FindSystemTimeZoneById?

У меня есть странная проблема, которую я не могу решить. Когда я вызываю TimeZoneInfo.GetSystemTimeZones на свою машину Win 7 x64, я получаю 101 результат. Когда я вызываю TimeZoneInfo.FindSystemTimeZoneById на каждом из них и передаю атрибут StandardName объекта TimeZoneInfo, 3 из них вызывают TimeZoneNotFoundException.

Здесь пример:

var tzs = TimeZoneInfo.GetSystemTimeZones();

foreach (var timeZoneInfo in tzs.OrderBy(t => t.BaseUtcOffset))
{
  try
  {
    TimeZoneInfo.FindSystemTimeZoneById(timeZoneInfo.StandardName);
  }
  catch (TimeZoneNotFoundException)
  {
    Console.WriteLine(timeZoneInfo.DisplayName + "|" + timeZoneInfo.StandardName + "|" + timeZoneInfo.BaseUtcOffset);
  }
}

Console.ReadLine();

У этого есть проблемы с поиском "Скоординированное всеобщее время", "Стандартное время в Иерусалиме" и "Стандартное время полуострова Малай". Принимая такой случай, как Малайзия, я могу видеть запись для него, когда я просматриваю доступные часовые пояса в своих региональных настройках, хотя он показывает атрибут DisplayName, а не стандартное имя:

Time zones

Однако я не могу видеть это под любым именем при просмотре реестра в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones

Что здесь происходит? Почему часовое поясе Малайзии не может быть загружено по имени?

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

Ответ 1

TimeZoneInfo.FindSystemTimeZoneById метод принимает идентификатор часового пояса в качестве параметра. Вместо этого вы используете timeZoneInfo.StandardName.

Кажется, что для этих трех зон значения для timeZoneInfo.StandardName и TimeZoneInfo.Id. Используя это:

TimeZoneInfo.FindSystemTimeZoneById(timeZoneInfo.Id);

решит проблему.