2012-01-11 2 views
2

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

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

Есть ли способ рассказать об этом «снова посмотреть», чтобы обновить системный часовой пояс?

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

ответ

1

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

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

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

+0

Я боялся (или, может быть, надеялся!), Было бы что-то в этом роде. У нас есть надежды на кросс-платформу позже, поэтому решение Posix не очень хорошо.Придется использовать документацию «если вы измените часовые пояса, перезапустите службу». – Jon

1

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

От человека странице:

ОПИСАНИЕ

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

Если переменная TZ не появляется в среде, переменная tzname инициализируются с наилучшим приближением местного времени часов стены, как указан в tzfile (5) -format файл МестноеВремя находится в каталоге системы часовых поясов (Смотри ниже). (Также часто видит/и т.д./МестноеВремя используется здесь, символическая ссылка на правильный файл в каталоге временных зон системы.)

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

#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

+0

К сожалению, мы надеемся, что это кросс-платформа, поэтому решение posix не собирается сокращать его. Но спасибо! – Jon