Стандартные способы изменения часового пояса в Linux с использованием c ++ - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь изменить часовой пояс на компьютере Linux с использованием C ++. Я использую Open Suse 42.3.

У меня есть смещение со знаком в минутах (которое является разницей местного часового пояса от GMT в минутах), которое я конвертирую в строку «GMT + HH: MM», затем использую это изменить часовой пояс. Местное время в Linux показано на основе

  1. переменной окружения TZ (для часового пояса) и
  2. / etc / localtime, которая является символьной ссылкой c на файл, присутствующий в /usr/share/zoneinfo.

с использованием

setenv("TZ", timezone, 1);
tzset();

Я могу изменить переменную TZ и получить правильное смещение для установленного часового пояса

long tz_offset(time_t when = NULL_TIME) {
   if (when == NULL_TIME)
      when = std::time(nullptr);
   auto const tm = *std::localtime(&when);
   std::ostringstream os;
   os << std::put_time(&tm, "%z");
   std::string s = os.str();
   // s is in ISO 8601 format: "±HHMM"
   int h = std::stoi(s.substr(0, 3), nullptr, 10);
   int m = std::stoi(s[0] + s.substr(3), nullptr, 10);

   return h * 60 + m;
}

Но символьная c ссылка / etc / localtime по-прежнему указывает на старый файл часового пояса.

Я попытался найти стандартный способ изменения часового пояса https://www.boost.org/doc/libs/1_48_0/libs/locale/doc/html/dates_times_timezones.html говорит, что поддержка часового пояса Boost.DateTime не работает.

Вопрос:

Существует ли какой-либо стандартный способ (C ++) изменить часовой пояс, кроме установки переменной окружения TZ?

Нужно ли менять символьную ссылку c также?

Спасибо

...