Потокобезопасное отображение часового пояса в C / C ++ - PullRequest
1 голос
/ 23 декабря 2009

У меня есть многопоточное приложение, которое должно отображать определенные даты для пользователя. Даты хранятся с использованием значений времени UTC Unix. Однако дата должна отображаться в часовом поясе пользователя, а не на локальном сервере или в формате UTC. По сути, мне нужна такая функция:

struct tm *usertime_r(const time_t *timer, struct tm *result, const int timezone) {
  <just like localtime_r, except it uses UTC+timezone as the timezone>
}

Эта функция должна быть поточно-ориентированной, поэтому я не верю, что установка переменной окружения TZ была бы опцией.

Ответы [ 2 ]

3 голосов
/ 23 декабря 2009

Если вы знаете смещение пользователя от UTC в секундах, вы можете просто добавить / вычесть это из time_t и передать результат в gmtime_r.

Например, восточное летнее время Австралии составляет +11, что означает, что вы добавите (11*3600) к значению времени.

1 голос
/ 23 декабря 2009

Как следствие ответа caf, заголовок <tzinfo.h> можно использовать для получения смещения от UTC для данного часового пояса. Общественная база данных часовых поясов содержит тонны информации; в дистрибутивах Linux, которые я использовал, он доступен для просмотра в /usr/share/zoneinfo, и я считаю, что Apple упаковывает его в iTunes для Win32.

Из командной строки большинства дистрибутивов вы можете сделать это:

# it's easy to find out what timezones are available
$ file /usr/share/zoneinfo/{US/Eastern,UTC}
/usr/share/zoneinfo/US/Eastern: timezone data
/usr/share/zoneinfo/UTC:        timezone data

# now examine them
$ zdump US/Eastern UTC
US/Eastern  Wed Dec 23 00:11:31 2009 EST
GMT         Wed Dec 23 05:11:31 2009 UTC

Похоже, что США / Восток в настоящее время в стандартном времени (летом будет напечатано EDT), и что это 5 часов до UTC, что дает вам смещение от UTC.

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