I have a setup working using localtime() to get a tm with the local times represented in it. And that is all good.
However, if I change timezone while the application is running, it does not notice that I have changed timezones.
Is there some way to tell it to 'go look again' to refresh to the system timezone?
I know this is probably not a common case, but it is what test are doing to test this feature, so they want it supported!
There's nothing in the standard library to do this. Unless your platform offers some extension to the library for updating the time zone, your program's calls to localtime()
will probably always use the time zone that was active at program start up.
You could probably work around that by putting the localtime
stuff in a separate process that your main program can startup and shutdown at will, thus re-initializing that process's time zone.
Or instead your platform may offer some other API for getting the local time that will reflect changes in the system time zone.
Take a look at tzset
(this is posix only). This might give you what you need. If your TZ
environment variable is unset, it should reinitialize from the OS.
From the man page:
DESCRIPTION
The tzset() function initializes the tzname variable from the TZ environment variable. This function is automatically called by the
other time conversion functions that depend on the time zone. In a
SysV-like environment it will also set the variables timezone
(seconds West of GMT) and daylight (0 if this time zone does not
have any daylight savings time rules, non-zero if there is a time
during the year when daylight savings time applies).
If the TZ variable does not appear in the environment, the tzname variable is initialized with the best approximation of local
wall clock time, as specified by the tzfile(5)-format file localtime
found in the system timezone directory (see below). (One also often
sees /etc/localtime used here, a symlink to the right file in the
system timezone directory.)
A simple test:
#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;
}
Gives me output:
tz: CST - CDT Wed Jan 11 12:35:02 2012
tz: EST - EDT Wed Jan 11 13:35:02 2012