Я пытаюсь изменить часовой пояс на компьютере Linux с использованием C ++. Я использую Open Suse 42.3.
У меня есть смещение со знаком в минутах (которое является разницей местного часового пояса от GMT в минутах), которое я конвертирую в строку «GMT + HH: MM», затем использую это изменить часовой пояс. Местное время в Linux показано на основе
- переменной окружения TZ (для часового пояса) и
- / 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 также?
Спасибо