I'm forwarding this message from Dmitri Pal, who is not on the time zone mailing list. Those of you who are on the list, please direct replies appropriately. --ado -----Original Message----- From: Dmitri Pal [mailto:dpal@redhat.com] Sent: Friday, October 24, 2008 2:52 To: tz@lecserver.nci.nih.gov Subject: Looking for advices regarding tzdata 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