Как получить TimeZone для метазонов с помощью FindSystemTimeZoneById? - PullRequest
0 голосов
/ 28 января 2011

Мне дали TzID (формат Olson tzid Exp: «Европа / Копенгаген»). После этого я попытался выполнить преобразование часового пояса для определенного DateTime из этого часового пояса (отличается от часового пояса сервера) в UTC с помощью класса c # TimeZonInfo .

Мне было интересно, почему идентификатор часового пояса окна имеет только около 100, тогда как идентификатор часового пояса для базы данных Olson tz имеет идентификатор около 405 тц. Допустим, для часового пояса «Европа / Копенгаген» я понятия не имею, как использовать FindSystemTimeZonebyID , чтобы получить информацию о часовом поясе для этого часового пояса (он был указан в метазонах в идентификатор Олсона для таблица преобразования идентификаторов Windows ). Кто-нибудь испытал в этом? Пожалуйста, помогите мне.

1 Ответ

1 голос
/ 28 января 2011

От MSDN :

FindSystemTimeZoneById пытается сопоставить идентификатор с именами подразделов ветви HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones реестра в Windows XP и Windows Vista. Эта ветвь не обязательно содержит полный список идентификаторов часовых поясов.

Исходя из таблицы, на которую вы ссылаетесь, вы хотите передать строку Europe_Central, поскольку это Windows-версия Olson "Europe / Copenhagen". (Обратите внимание, что в соответствии с документами MSDN он не чувствителен к регистру.) Если это не сработает, следует проверить реестр, чтобы убедиться, что запись Europe_Central существует.

Подробнее о базе данных Olson tz и о том, как она определяет часовые пояса, см. wikipedia .


Обновление 1:

В моем реестре (Vista) он указан как Central Europe Standard Time, это строка, которую мне нужно передать в качестве параметра, у вас есть похожая запись?

Если эта запись отсутствует в вашем реестре, вы можете создать ее самостоятельно , используя информацию из здесь , хотя похоже, что вам придется создавать правила для летнего времени (см. ссылку).

Вы также можете попробовать использовать DateTimeOffset с DateTime, хранящим время на локальном сервере и передающим TimeSpan +1 час (CET).

В зависимости от того, что вы пытаетесь сделать, вы также можете просто вычесть один час из времени CET, чтобы получить UTC. (Хотя это не сработает, как только Центральное европейское летнее время вступит в силу; тогда вам нужно вычесть два часа.)

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