Изменить часовой пояс .NET CLR без использования реестра - PullRequest
2 голосов
/ 27 сентября 2011

Я бы хотел изменить часовой пояс по умолчанию .NET CLR без использования реестра или изменения часового пояса моей ОС.Есть ли способ?

РЕДАКТИРОВАТЬ: Похоже, что .NET CLR просто не поддерживает наличие часового пояса по умолчанию, отличного от ОС (в отличие от JVM).

Другими словами, я бы хотел, чтобы это утверждение возвращало что-то, отличное от часового пояса моей ОС:

TimeZoneInfo timeZoneInfo = TimeZoneInfo.Local;
Console.Out.WriteLine("timeZoneInfo = {0}", timeZoneInfo);

Причина, по которой я хотел бы это сделать, - запустить a.NET GUI с часовым поясом моих пользователей (Лондон), а не с часовым поясом моего компьютера (Чикаго).

Например, вы можете изменить часовой пояс времени выполнения Java, добавив в командную строку:

-Duser.timezone="Europe/Berlin"

Так, например, если вы хотите, чтобы DateTime.Now возвращал другой часовой пояс, вы не можете без изменения всех ссылок на DateTime.Now на что-то другое, чего я и надеялся избежать впервое место.

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

Вы спрашиваете о получении другого результата для настройки часового пояса, но я предполагаю, что в итоге вы заинтересованы в том, чтобы время, возвращаемое в другом часовом поясе, было по умолчанию.

.NET Framework поддерживаетUTC, местное, а также общее значение времени без учета часового пояса.См. Перечисление DateTimeKind .

При работе со значениями времени я обычно использую UTC для всего внутреннего и преобразую в определенную зону при взаимодействии с пользователем.

Итак, чтобыответить на ваш вопрос единственный способ узнать местное время, возвращенное в другом часовом поясе, - это изменить часовой пояс устройства.

В начале сказано, что для получения желаемого эффекта вы можете написать служебный класс, который получает время в формате UTC, а затем использовать параметр конфигурации, чтобы сохранить смещение, применяемое перед его возвратом.

0 голосов
/ 27 сентября 2011

Вместо того чтобы полагаться на CLR / framework для предоставления вам информации о часовом поясе, вы должны полагаться на внешний источник информации для работы с часовыми поясами.

Я рекомендую использовать общедоступную базу данных о часовых поясах (также известную как tz или база данных Olson ). Хотя он не претендует на 100% точность, я нашел его точным для всего, что мне нужно использовать.

Существуют классы .NET, которые могут анализировать эту базу данных, а именно ZoneInfo (база данных tz / база данных Олсона) .NET API . Обратите внимание, что бинарного дистрибутива нет, вам придется скачать последнюю версию и скомпилировать его самостоятельно.

Используя эту библиотеку, вы находите часовой пояс, который вам нужен (они представлены в ZoneInfo объектах) для региона, в котором вы ищете, затем вы можете дать ей DateTime для выполнения различных функций над ней (например, получить смещение UTC на эту дату, получить текущее местное время, время UTC и т. д.).

Обратите внимание, это точнее, чем .NET API IMO, поскольку для этого требуется указать дату, для которой требуется получить информацию о часовом поясе; различные регионы со временем изменили правила, касающиеся смещений UTC, и база данных tz вместе с API ZoneInfo хорошо представляют эту историю и дают точные результаты.

Не беспокойтесь об отсутствии каких-либо изменений в API с 2009 года; на момент написания этой статьи он в настоящее время анализирует все файлы в последнем нарушении данных (на самом деле я запускал его для ftp: //elsie.nci.nih.gov/pub/tzdata2011k.tar.gz файл 25 сентября 2011 г. - в марте 2017 г. его можно получить по адресу ftp: //ftp.iana.org/tz/releases/tzdata2017a.tar.gz).

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