UTC到ANSI C的当天时间?

时间:2010-02-16 08:12:32

标签: c

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

2 个答案:

答案 0 :(得分:6)

你必须混合使用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

答案 1 :(得分:3)

微米。 MARIE的答案实际上并不适用于提出的问题:tzset()是POSIX,但不是ANSI C作为原始问题的标题。在C90或C99中都没有提到它(从搜索标准草案开始;我无法获得最终标准)。

OP的问题可能有点含糊不清,因为不清楚“utc time”是什么意思,但可能他说的是破碎的组件,让我们说填入struct tm

在C99中可以通过解析strftime("%z",...)的输出来确定本地TZ与UTC的偏移(确保使用您自己的日期值来调用它,因为此偏移将随时间变化);但是这个格式代码在C90中不可用,所以如果你必须符合C90,AFAIK你运气不好,除非你想尝试解析strftime("%Z",...)的输出,但这基本上是非便携式的。

然后,您可以使用time_t将您的UTC组件转换为mktime(),但它们将被解释为当地时区;然后应用偏移量,并使用localtime()转换回分解的组件。当您的本地时区切换到DST或从DST切换到时区时,您可能会遇到边缘情况,但这可以通过移动到不使用DST的区域设置或通过改进的方式轻松避免。在同时调用tm_dst0时将strftime()设置为mktime()

或者,不要将自己限制在ANSI C。