![](/img/trans.png)
[英]In ANSI C, how to handle > or < time expressions crossing midnight without using a day variable
[英]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.