Преобразование даты и времени из одного часового пояса в другой (родной C ++) - PullRequest
0 голосов
/ 05 июля 2010

Клиенты со всего мира могут отправлять определенные «запросы» на мое серверное приложение. Все эти клиенты находятся в разных часовых поясах.

Для каждого запроса мне нужно отобразить запрос на внутренний экземпляр класса C ++. Каждый экземпляр класса имеет некоторую информацию о своем «местоположении», которая также указывается часовым поясом.

Каждый клиент может отправлять запросы, касающиеся экземпляров, принадлежащих к различным часовым поясам. Чтобы мои клиенты не могли самостоятельно конвертировать все в часовой пояс целевого экземпляра, я должен сам все конвертировать из одного часового пояса в другой. Однако я нахожу только в C ++ (неуправляемые, собственные) функции для преобразования времени между местным временем и GTM, но не из / в часовой пояс, который не является вашим текущим часовым поясом.

Я мог бы попросить своих клиентов отправлять каждую дату в формате UTC или GTM, но это не решает мою проблему, так как мне все еще нужно преобразовать это в часовой пояс «экземпляра», который может быть любым часовым поясом в мир.

Мне также кажется, что я не могу найти функцию Windows, которая делает это. Я обнаружил, что это управляемый класс .Net, но я хочу, чтобы мое приложение оставалось строго неуправляемым.

Существуют ли какие-либо функции Windows (XP, Vista, 7, 2003, 2008), которые я могу использовать (и которые я упустил из виду в документации), или есть какие-либо другие бесплатные алгоритмы, которые могут преобразовывать один часовой пояс в другой?

Обратите внимание, что проблема связана не с GMT-разницей, а с фактическим моментом перехода DST, который, похоже, зависит от часового пояса. Например:

  • Западная Европа переходит от не-ТЛЧ к ТЛЧ в последнее воскресенье перед 1 апреля.
  • США переходит от летнего времени к летнему времени во второе воскресенье после 1 марта.
  • В Китае нет летнего времени.
  • Австралия переходит с не-летнего времени на летнее время в первое воскресенье после 1-го октября.

Вся эта информация о DST-переходах доступна где-то в реестре Windows. Проблема в том, какую функцию Windows я могу использовать для использования этой информации.

1 Ответ

2 голосов
/ 05 июля 2010

Я не знаю способа извлечения информации о других часовых поясах через API: я видел, что это было сделано путем запроса реестра (мы делаем это в продукте на основе WindowsCE).

Часовые пояса определяются как ключи реестра в

HKLM\Software\Microsoft\Windows NT\Current Version\Time Zones

Каждый ключ содержит несколько значений, а ключ, который сообщает вам о смещениях и переходе на летнее время, является ключом TZI.Это двоичный двоичный объект, представляющий эту структуру:

typedef struct
{
    LONG m_nBias;
    LONG m_nStandardBias;
    LONG m_nDaylightBias;
    SYSTEMTIME m_stcStandardDate;
    SYSTEMTIME m_stcDaylightDate;
} TZI;

Найдите на странице MSDN TIME_ZONE_INFORMATION (http://msdn.microsoft.com/en-us/library/ms725481(v=VS.85).aspx), чтобы узнать, как интерпретировать поля смещения, особенно поля StandardDate и DaylightDate -они мягко используются для поддержки таких конструкций, как «последняя суббота апреля».

HTH

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