UTC到ANSI C中的时间?

UTC到ANSI C中的时间?,c,C,如何将utc时间转换为一天的本地时间?您必须将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");

如何将utc时间转换为一天的本地时间?

您必须将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;
}

M.MARIE的回答实际上并不适用于提出的问题:tzset()是POSIX,但不是原始问题的标题ANSI C。C90或C99中都没有提到它(通过搜索标准草案;我无法访问最终标准)

OP的问题可能有点模糊,因为不清楚他所说的“utc时间”是什么意思,但他大概是指分解的组件,比如说填充到
struct tm

在C99中,可以通过解析
strftime(“%z”,…)
的输出来确定本地TZ相对于UTC的偏移量(请确保使用自己的日期值来调用它,因为此偏移量将随时间变化);但是这种格式代码在C90中是不可用的,所以如果您必须遵守C90,那么您可能会运气不佳,除非您想尝试解析
strftime(“%Z”,…)
的输出,但这基本上是不可移植的

然后,您可以使用
mktime()
将UTC组件转换为
time\t
,尽管它们将被解释为在本地时区中;然后应用偏移量,并使用
localtime()
将其转换回分解的组件。当本地时区切换到DST或从DST切换到DST时(或当您的时区偏移发生变化时),您可能会遇到边缘情况,但这可以通过移动到不使用DST的区域设置来轻松避免,或者通过在调用
strftime()时将
tm_DST
设置为
0
来改善
mktime()

或者,不要局限于ANSI C

$ ./tolocal 
gmt: Tue Feb 16 09:37:30 2010
cet: Tue Feb 16 08:37:30 2010