簡體   English   中英

UTC到ANSI C的當天時間?

[英]UTC to Time of the day in ANSI 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");
    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

M. MARIE的答案實際上並不適用於提出的問題:tzset()是POSIX,但不是ANSI C作為原始問題的標題。 在C90或C99中都沒有提到它(從搜索標准草案開始;我無法訪問最終標准)。

OP的問題可能有點含糊不清,因為不清楚“utc time”是什么意思,但可能他說的是破壞的組件,讓我們說填充到一個struct tm

通過解析strftime("%z",...)的輸出,可以在C99中確定本地TZ與UTC的偏移量(確保用自己的日期值調用它,因為此偏移量會隨時間變化); 但是這個格式代碼在C90中不可用,所以如果你必須符合C90,那么AFAIK你運氣不好,除非你想嘗試解析strftime("%Z",...)的輸出strftime("%Z",...) ,但那是從根本上講是不便攜的。

然后,您可以使用mktime()將UTC組件轉換為time_t ,盡管它們將被解釋為在本地時區; 然后應用偏移量,並使用localtime()轉換回故障組件。 當您的本地時區切換到DST或從DST切換到時區時,您可能會遇到邊緣情況,但這可以通過移動到不使用DST的區域設置或通過改進的方式輕松避免。調用strftime()mktime()時將tm_dst設置為0

或者,不要將自己局限於ANSI C.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM