Как узнать текущий часовой пояс? - PullRequest
28 голосов
/ 26 января 2010

В большинстве примеров, которые я видел:

time_zone_ptr zone( new posix_time_zone("MST-07") ); 

Но я просто хочу получить текущий часовой пояс для машины, на которой выполняется код. Я не хочу жестко кодировать название часового пояса.

Ответы [ 5 ]

10 голосов
/ 28 января 2010

Простой posix: вызовите tzset, используйте tzname .

#include <ctime>
tzset();
time_zone_ptr zone(new posix_time_zone(tzname[localtime(0)->tm_isdst]));

Posix с glibc / bsd дополнениями:

time_zone_ptr zone(new posix_time_zone(localtime(0)->tm_zone));

Выше приведены сокращения Часовые пояса Posix , определенные в терминах смещения от UTC и нестабильные во времени (есть более длинная форма, которая может включать переходы DST, но не политические и исторические переходы).

ICU является портативным и имеет логику для извлечения системного часового пояса как часового пояса Олсона (фрагмент sumwale ):

// Link with LDLIBS=`pkg-config icu-i18n --libs`
#include <unicode/timezone.h>
#include <iostream>

using namespace U_ICU_NAMESPACE;

int main() {
  TimeZone* tz = TimeZone::createDefault();
  UnicodeString us;
  std::string s;

  tz->getID(us);
  us.toUTF8String(s);
  std::cout << "Current timezone ID: " << s << '\n';
  delete tz;
}

В Linux ICU реализован так, чтобы быть совместимым с tzset и смотрит на TZ и /etc/localtime, который в современных системах Linux считается символической ссылкой, содержащей идентификатор Олсона ( вот история ). См. uprv_tzname для деталей реализации.

Boost не знает, как использовать идентификатор Олсона. Вы можете построить posix_time_zone, используя смещения не-DST и DST, но на этом этапе лучше продолжать использовать реализацию ICU. См. FAQ по бусту .

4 голосов
/ 08 августа 2014

Довольно поздно, но я искал что-то похожее, так что, надеюсь, это поможет другим. Следующий (не бустовый) способ использования strftime работает на большинстве платформ:

  time_t ts = 0;
  struct tm t;
  char buf[16];
  ::localtime_r(&ts, &t);
  ::strftime(buf, sizeof(buf), "%z", &t);
  std::cout << "Current timezone: " << buf << std::endl;
  ::strftime(buf, sizeof(buf), "%Z", &t);
  std::cout << "Current timezone: " << buf << std::endl;

Или можно использовать std :: time_put для чистой версии C ++.

1 голос
/ 01 февраля 2015

Чтобы правильно ответить на этот вопрос, важно понимать, что поддержка часовых поясов в Boost строго ограничена.

  • Основное внимание уделяется часовым поясам POSIX, которые имеют несколько ограничений. Эти ограничения обсуждаются в разделе POSIX тега часового пояса wiki , поэтому я не буду повторять их здесь.

  • У него есть функции, которые работают с идентификаторами часовых поясов IANA / Olson, но он искусственно сопоставляет их со значениями POSIX, что приводит к сглаживанию часового пояса в одной точке истории. Эти сопоставления хранятся в CSV-файле в исходном коде Boost.

  • Файл csv не обновлялся с апреля 2011 года, и с тех пор было много изменений часовых поясов. Таким образом, отображение, которое имеет , несколько неточно.

В общем, я бы не рекомендовал Boost для работы с часовыми поясами. Вместо этого рассмотрим классы ICU TimeZone , которые являются частью проекта ICU . Вы найдете их полностью переносимыми, и они имеют полную и правильную поддержку часового пояса.

Стоит отметить, что ICU используется во многих популярных приложениях. Например, веб-браузер Google Chrome получает поддержку часового пояса от ICU.

В ICU текущий часовой пояс локальной системы доступен как часовой пояс по умолчанию . Вы можете прочитать больше в разделе «Заводские методы и часовой пояс по умолчанию» в документации ICU.

1 голос
/ 27 января 2010

Ну, может быть, вы могли бы сделать это с помощью библиотеки GeoIP. Я знаю, что это немного излишне, но, поскольку большинство компьютеров в мире подключены к Интернету, вам, вероятно, это сойдет с рук. По словам парня, для которого я разрабатываю, точность была более 99%.

Примечание: это глупая идея. Я просто стремлюсь к ответам.

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

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

...