К сожалению, в настоящее время нет стандартных функций для этого.
Позволяет проверить (используя отражатель), как работает метод TimeZoneInfo.FindSystemTimeZoneById ().Он просто принимает одно из значений из поля s_systemTimeZones:
private static Dictionary<string, TimeZoneInfo> s_systemTimeZones
{
get
{
if (s_hiddenSystemTimeZones == null)
{
s_hiddenSystemTimeZones = new Dictionary<string, TimeZoneInfo>();
}
return s_hiddenSystemTimeZones;
}
set
{
s_hiddenSystemTimeZones = value;
}
}
В этом поле хранятся все доступные TimeZoneInfo-s.И когда вы вызываете FindSystemTimeZoneById (id), он просто выбирает какое-то значение из предварительно заполненного словаря.Я не знаю, когда этот словарь инициализируется и какие значения он использует для инициализации.Но парень из этой темы сказал, что TimeZoneInfo использует значения из реестра: HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Time Zones
Наиболее очевидный способ - создать собственный словарь словаря и заполнить егоценности.Примерно так:
Dictionary<string, TimeZoneInfo> dictionary = new Dictionary<string, TimeZoneInfo>();
TimeZoneInfo info = new TimeZoneInfo("ID", new TimeSpan(0, 1, 0, 0), "SomeCultureName", "Some Standard Time", "Some Daylight Time", null, true);
dictionary.Add("Some time", info);
Но есть еще одна проблема: конструктор TimeZoneInfo является приватным.Поэтому, если вы хотите использовать функции FindSystemTimeZoneById () и ConvertTimeFromUtc (), вам следует реализовать их с нуля.Создайте некоторый класс, который представляет часовой пояс, создайте и заполните словарь этого класса информацией о часовых поясах и так далее ...
Не очень хорошие новости, я знаю.Но я надеюсь, что это будет полезно для вас :)