2014-11-10 3 views
0

У меня есть имена часового пояса, как Европа/Париж, Америка/Триатлон, как описано в
http://en.wikipedia.org/wiki/List_of_tz_database_time_zonesКак рассчитать UTC смещение от IANA названия часовых поясов в C

Учитывая эти строки (например, «Европа/Париж») Я хочу знайте смещение UTC в секундах для этих часовых поясов.

Один из способов, которым я могу думать, - это играть с переменными окружения TZ, чтобы установить часовой пояс и вычислить смещение. Но я могу точно выяснить, как это сделать.

Я работаю в C на Linux.

Нужны ваши предложения!

+1

UTC-коррекция большинства часовых поясов не является постоянной по причине летнего времени. – duskwuff

+0

@duskwuff Согласен. Также смещение часовых поясов зависит от разных исторических периодов. Мне нравится ответ Мариан, который дает смещение _current_. – chux

ответ

2

Я использую следующий код, чтобы получить время с определенным часовым поясом.

time_t mkTimeForTimezone(struct tm *tm, char *timezone) { 
    char  *tz; 
    time_t  res; 

    tz = getenv("TZ"); 
    if (tz != NULL) tz = strdup(tz); 
    setenv("TZ", timezone, 1); 
    tzset(); 
    res = mktime(tm); 
    if (tz != NULL) { 
     setenv("TZ", tz, 1); 
     free(tz); 
    } else { 
     unsetenv("TZ"); 
    } 
    tzset(); 
    return(res); 
} 

С помощью этой функции вычисление смещения осуществляется в прямом направлении. Например:

int main() { 
    char  *timezone = "America/New_York"; 
    struct tm tt; 
    time_t t; 
    int  offset; 

    t = time(NULL); 
    tt = *gmtime(&t); 
    offset = mkTimeForTimezone(&tt, timezone) - t; 
    printf("Current offset for %s is %d\n", timezone, offset); 
} 
+1

Скорее всего, вы должны сохранить копию возврата из 'getenv()', а не указатель на тот же, что и вызов setenv() ', вполне может изменить базовую строку. – Hasturkun

+0

@Hasturkun Спасибо. Я исправил это. Хотя он работал в нашем производственном коде в течение многих лет :). – Marian

+0

+1 для получения полного ответа (Незначительный: предпочтет ошибку, если mkTimeForTimezone() не работает.) – chux