У вас вообще нет двух разных структур тм вообще. У вас есть два указателя на структуру tm, оба указывают на одну и ту же статическую структуру, возвращаемую локальным временем. Таким образом, кажется, что изменения одного влияют на другое, но в действительности это просто одна структура, имеющая два разных указателя.
Самый безопасный способ решить эту проблему - не полагаться на статическую структуру localtime
, а использовать localtime_r
, который требует, чтобы вы передали собственный указатель структуры tm, который затем будет заполнен. Например:
void Tracker::uiuctime_tm(struct tm* out){
time_t uiucTime;
// give currentTime the current time
time(&uiucTime);
// change the time zone to UIUC
putenv("TZ=CST6CDT");
tzset();
// get the localtime for the tz selected, and set back the result into the output parameter.
localtime_r(&uiucTime, out);
// set back the current timezone
unsetenv("TZ");
tzset();
}
struct tm uiuctime;
uiuctime_tm(&uiuctime);