версия на GitHub

аюсь перенести приложение WPF в SilverLight 4. Приложение WPF использует TimeZoneInfo.FindSystemTimeZoneById () и TimeZoneInfo.ConvertTimeFromUtc () для преобразования DateTime конкретного часового пояса в DateTime другого конкретного часового пояса.

Но я не могу найти ни одну из этих функций в SilverLight 4. SilverLight поддерживает преобразование часовых поясов только между Utc и Local.

Есть ли способ конвертировать DateTime из любого часового пояса в любой другой часовой пояс в SilverLight?

Ответы на вопрос(3)

но я сделал это некоторое время назад и разместил это на сайте сообщества MS, чтобы люди могли его использовать, потому что его всегда спрашивали. Я не делал поиск идентификаторов часовых поясов, но я использовал метод FromSerializedString () в моем приложении SL. Мои веб-сервисы передавали бы данные ToSerializedString () как строковое свойство, а в SL я просто использовал этот объект по мере необходимости. Я сделал отражатель объекта TimeZoneInfo.

https://github.com/TWhidden/DevStuff/blob/master/StackOverflow/TimeZoneInfo.cs

Не уверен, поможет ли это вам (или любому будущему читателю этого поста).

Это было весело, и решил мою проблему. Я использовал это для V3 Silverlight, так что это должно быть хорошо для 4/5, но также может быть улучшено Microsoft уже.

Обновлено 2017-04-12: Ссылка на GitHub, используя это в библиотеке PCL. Должно работать на SL, но мы отказались от этого, как MS много лет назад.

 Kirk Broadhurst15 мар. 2013 г., 06:30
Было бы здорово, но ссылка сейчас мертва ...
 TravisWhidden12 апр. 2017 г., 23:09
Обновлено для использования ссылки Github.
Решение Вопроса

в настоящее время нет стандартной функциональности для этого.

Давайте проверим (используя отражатель), как работает метод 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-ы. И когда вы вызываете 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 (), вам следует реализовать их с нуля. Создайте некоторый класс, который представляет часовой пояс, создайте и заполните словарь этого класса информацией о часовых поясах и так далее ...
Не очень хорошие новости, я знаю. Но я надеюсь, что это будет полезно для вас :)

если кто-нибудь натолкнется на эту тему, вот что я нашел ...

Справочный исходный код Microsoft для TimeZoneInfo (в полной версии .NET 4 CLR) включаетTryGetTimeZoneByRegistryKey() метод, который получает часовые пояса из раздела реестраHKLM\Software\Microsoft\Windows NT\CurrentVersion\Time Zones.

Я думаю, если бы вы писали надежное приложение Silverlight, вы могли бы использовать P / Invoke для поиска в реестре.

Для нашего приложения мы не хотим показывать диалог, запрашивающий разрешения полного доверия. Я сделал еще несколько поисков и нашелStephane Delcroix с открытым исходным кодом реализации - Я не уверен, есть ли более официальный источник, чем эта ссылка. Работает с форматом базы данных часовых поясов Unix (ZoneInfo), который вы можетескачать от IANA.

База данных часовых поясов довольно велика, и размер приложения Silverlight увеличился бы, если бы вы включили его. Но нам нужно было поддерживать только несколько часовых поясов. Я взял часть базы данных и упаковал ее в наше приложение Silverlight в качестве ресурса; затем я изменил код Стефана для чтения из потока ресурсов, а не из файловой системы. Мне пришлось удалить все функции локального времени, так как нет / etc / localtime. Но нам нужны были только именованные часовые пояса и возможность конвертировать между этими часовыми поясами и UTC. Этот подход, кажется, работает хорошо.

 Richard Beier31 мар. 2012 г., 03:08
Хм. Я на самом деле не использовал загрузку IANA - я просто скопировал содержимое / etc / zoneinfo с ближайшего компьютера Linux в нашей сети. Оказывается, файлы IANA представлены в текстовом формате, и вам нужно запустить их через компилятор часового пояса («zic»). Источник "zic" также находится на той же странице IANA; но я думаю, что проще использовать двоичные файлы, если у вас есть Linux-машина для их получения.
 Richard Beier31 мар. 2012 г., 03:14

Ваш ответ на вопрос