Silverlight преобразование часового пояса - PullRequest
6 голосов
/ 06 января 2011

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

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

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

Ответы [ 3 ]

2 голосов
/ 07 января 2011

К сожалению, в настоящее время нет стандартных функций для этого.

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

1 голос
/ 07 июня 2012

Немного поздно, но я сделал это некоторое время назад и разместил его на сайте сообщества 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 много лет назад.

0 голосов
/ 31 марта 2012

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

Справочный исходный код 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. Этот подход, кажется, работает хорошо.

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