UTC к времени дня в ANSI C? - PullRequest
       0

UTC к времени дня в ANSI C?

4 голосов
/ 16 февраля 2010

как перевести время utc в местное время дня?

Ответы [ 2 ]

6 голосов
/ 16 февраля 2010

Вы должны использовать сочетание tzset () с функциями time / gmtime / localtime / mktime.

Попробуйте это:

#include <stdio.h>
#include <stdlib.h>

#include <time.h>

time_t makelocal(struct tm *tm, char *zone)
{
    time_t ret;
    char *tz;

    tz = getenv("TZ");
    setenv("TZ", zone, 1);
    tzset();
    ret = mktime(tm);
    if(tz)
        setenv("TZ", tz, 1);
    else
        unsetenv("TZ");
    tzset();
    return ret;
}

int main(void)
{
    time_t gmt_time;
    time_t local_time;
    struct tm *gmt_tm;

    gmt_time = time(NULL);
    gmt_tm = gmtime(&gmt_time);
    local_time = makelocal(gmt_tm, "CET");

    printf("gmt: %s", ctime(&gmt_time));
    printf("cet: %s", ctime(&local_time));

    return 0;
}

По сути, эта программа принимает текущий компьютерный день как GMT (время (NULL)) и конвертирует его в CET:

$ ./tolocal 
gmt: Tue Feb 16 09:37:30 2010
cet: Tue Feb 16 08:37:30 2010
3 голосов
/ 27 апреля 2011

M. Ответ MARIE на самом деле не работает для поставленного вопроса: tzset () - это POSIX, но не ANSI C, как указано в заголовке исходного вопроса. Ни в C90, ни в C99 об этом не упоминается (из поиска проектов стандартов; у меня нет доступа к окончательным стандартам).

Вопрос OP, возможно, немного расплывчат, поскольку неясно, что он имеет в виду под "временем без ответа", но, вероятно, он имеет в виду сломанные компоненты, скажем, заполненные в struct tm.

В C99 можно определить смещение локального TZ от UTC, анализируя вывод strftime("%z",...) (убедитесь, что вы вызываете его со своими собственными значениями даты, так как это смещение будет меняться со временем); но этот код формата недоступен в C90, поэтому AFAIK вам не повезло, если вы должны соответствовать C90, если только вы не хотите попытаться проанализировать вывод strftime("%Z",...), но это будет принципиально непереносимо.

Затем вы можете преобразовать свои компоненты UTC в time_t, используя mktime(), хотя они будут интерпретироваться как в местном часовом поясе; затем примените смещение и преобразуйте обратно в сломанные компоненты, используя localtime(). Вы можете столкнуться с крайними случаями примерно в то время, когда ваш местный часовой пояс переключается на летнее время и обратно (или когда происходит смещение часового пояса, когда это происходит), но этого можно легко избежать, перейдя в локаль, которая не использует летнее время, или установка tm_dst в 0 при вызове strftime() и mktime().

В качестве альтернативы, не ограничивайте себя ANSI C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...