c ++ местное время при смене часового пояса - PullRequest
4 голосов
/ 11 января 2012

У меня есть установка, работающая с использованием localtime (), чтобы получить ТМ с местным временем, представленным в нем.И это все хорошо.

Однако, если я изменяю часовой пояс во время работы приложения, он не замечает, что я изменил часовой пояс.

Есть ли какой-нибудь способ сказать ему 'goпосмотрите еще раз, чтобы обновить системный часовой пояс?

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

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Взгляните на tzset (это только posix).Это может дать вам то, что вам нужно.Если переменная окружения TZ не установлена, она должна повторно инициализироваться из ОС.

со страницы руководства:

ОПИСАНИЕ

Инициализируется функция tzset ()переменная tzname из переменной окружения TZ.Эта функция автоматически вызывается другими функциями преобразования времени, которые зависят от часового пояса.В среде, подобной SysV, он также устанавливает переменные часового пояса (секунды к западу от GMT) и дневного света (0, если в этом часовом поясе нет правил перехода на летнее время, и ненулевое значение, если в течение года есть время в течение летнего времени).применяется время).

Если переменная TZ не появляется в среде, переменная tzname инициализируется с наилучшим приближением местного времени настенных часов, как указано в файле формата tzfile (5) localtime, найденном вкаталог системного часового пояса (см. ниже).(Здесь также часто используется / etc / localtime, символическая ссылка на нужный файл в системном каталоге часовых поясов.)

Простой тест:

#include <iostream>
#include <time.h>
#include <stdlib.h>

int main()
{
        tzset();

        time_t t;
        time(&t);

        std::cout << "tz: " << tzname[0] << " - " << tzname[1] << " " << ctime(&t) << std::endl;

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

        std::cout << "tz: " << tzname[0] << " - " << tzname[1] << " " << ctime(&t) << std::endl;

        return 0;
}

Дает вывод:

tz: CST - CDT Ср. 11 января 12:35:02 2012

tz: EST - EDT Ср. 11 января 13:35:02 2012

1 голос
/ 11 января 2012

В стандартной библиотеке нет ничего, чтобы сделать это. Если ваша платформа не предлагает какое-либо расширение библиотеки для обновления часового пояса, вызовы вашей программы на localtime(), вероятно, всегда будут использовать часовой пояс, который был активен при запуске программы.

Вероятно, вы могли бы обойти это, поместив localtime в отдельный процесс, который ваша основная программа может запускать и выключать по желанию, таким образом повторно инициализируя часовой пояс этого процесса.

Или вместо этого ваша платформа может предложить какой-то другой API для получения местного времени, который будет отражать изменения в часовом поясе системы.

...