Looking for advices regarding tzdata
Dmitri Pal
dpal at redhat.com
Fri Oct 24 18:49:32 UTC 2008
Hi,
I am new to tzdata and advanced time zone conversion technics that it
offers.
I read couple articles about tzdata on wikipedia and in man pages.
So far I do not see what I am looking for so may be it just does not exist.
Here is what I am trying to accomplish.
Input:
YYYYMMDDHHMMSS - date or some other date format that can be easily
broken into tm structure.
TZ information - I was hoping to use some kind of meaningful string so
time zone names. Names from zone.dat would work perfectly.
Output:
Number of seconds since 1 Jan 1970 in UTC time that corresponds to the
time stamp
Processing:
* The function that would do the conversion needs to parse and validate
the format before conversion can happen. That includes validating the TZ
name.
* Would be nice to use standard libc functions to do this conversion as
much as possible
What is missing:
I am currently on Red Hat Enterprise Linux 5.1. It has
/usr/share/zoneinfo and there I found zone.dat.
Is there any function or set of functions that allow me to interact with
this database like:
get_next_timezone_name - to iterate through the list and get the
timezone. Is there any abstraction around this file?
In different distributions it can be in different places and under
different names. But libc functions hide this complexity so is there any
API that will let me to enumerate timezones and or check if the
XXXX/YYYY is the correct valid time zone name without dealing with the
file myself?
Also the other part is determining the daylight savings at the moment of
conversion in the specified time zone?
Would it be something like breaking the input I have into the tm
structure , calling tzset(timezonename) and then call mktime?
#include <time.h>
#include <stdlib.h>
time_t my_time (struct tm *tm, char *timezonename) {
time_t ret;
char *tz;
tz = getenv("TZ");
setenv("TZ", timezonename, 1);
tzset();
ret = mktime(tm);
if (tz)
setenv("TZ", tz, 1);
else
unsetenv("TZ");
tzset();
return ret;
}
This example is based on the timegm example but seems to contradict
mktime man page that states that mktime sets the timezone variable itself.
In other words I can populate a part of the tm from the data I have but
I need to populate the tm_isdst based on the timezone.
Would the code above accomplish the task?
I feel like something might be wrong with this but I am not sure what.
So this is where I am and I am bit lost. Please advise.
Thank you
Dmitri Pal
More information about the tz
mailing list