2011-07-23 84 views
2

我想從本地時間獲取UTC時間。反之亦然,它工作正常。當我想將本地時間轉換爲UTC時,爲了更新RTC時鐘,我只遇到問題。這就是我在做的:UTC時間從時間戳

t是本地時間戳。

char *tz = "GMT-2GMT,M3.5.0/3,M10.5.0/4"; 

t = 1311444000; // 23/07/11 18:00:00 

set_TZ(tz); 

gmt_time = gmtime(&t); 
mktime(gmt_time); 
printf("GMT Time: %s\r\n",asctime (gmt_time)); 

這給了我18:00:00,當它應該是減去時區。

我該如何解決這個問題?

+0

set_TZ設置TZ變量,它的存在表明該時區設置正確。它用於解析POSIX格式。 – nikolas

回答

0

經過進一步測試下面的代碼,這似乎工作。 Im在UTC + 2,目前在DST。 UTC返回的時間是正確的。我將在沒有DST的情況下進一步測試並查看返回的內容。

struct tm tm; 
struct tm *local_time; 
char *tz = "GMT-2GMT,M3.5.0/3,M10.5.0/4"; 
time_t t; 

tm.tm_hour = 18; 
tm.tm_min = 0; 
tm.tm_sec = 0; 

tm.tm_wday = 0; 
tm.tm_yday = 0; 

tm.tm_year = (2011) - 1900; 
tm.tm_mday = 22; 
tm.tm_mon = 7 - 1; 
tm.tm_isdst = -1; 

set_TZ(tz); 

t = mktime(&tm); 
local_time = localtime(&t); 
printf("Local Time: %s\r\n",asctime (local_time)); 
local_time = gmtime(&t); 
printf("UTC Time: %s\r\n",asctime (local_time)); 

輸出:

Local Time: Fri Jul 22 18:00:00 2011 
UTC Time: Fri Jul 22 15:00:00 2011 
3

這裏的問題是time_t應該表示自紀元以來的秒數(簡化,參見腳註)。這不受時區影響。如果將時區偏移量添加到time_t,則沒有任何功能將按預期工作。部分問題是,有時不可能知道如何正確地將這樣的值轉換爲POSIX時間戳 - 當時鍾在秋季回滾時,我住的時鐘將在相同時間兩次讀取1:30   AM一天,沒有更多的信息,你無法弄清楚UTC時間是什麼。

在轉換爲POSIX時間戳之前,您需要將其轉換爲本地日曆時間,然後才能轉換爲UTC日曆時間。

// NOTE: not reentrant 
time_t local_to_posix(time_t t) { 
    struct tm *tm; 
    time_t tt; 
    tm = gmtime(&t); // No timezone compensation 
    tm->tm_isdst = -1; // Let mktime figure out daylight savings 
         // NOTE: this WILL be wrong for one hour each year 
    tt = mktime(tm); // Converts local time to POSIX timestamp 
    return tt; 
} 

您可以將結果再傳給gmtime,這將給你的UTC日曆時間。

腳註:嚴格地說,這些時間戳不是UTC,也不是測量自epoch以來的秒數。它們是POSIX時間戳,從曆元開始算起秒,就好像沒有閏秒一樣。除非你的實時時鐘是一個原子鐘,否則這可能是無關緊要的。

+0

我從用戶設置的網頁接收日期和時間,因此它的本地時間,他們也選擇他們的時區。我想以UTC保存這個時間,所以每次我撥打本地時間時,都會正確調整時間。將它存儲在本地時間可以嗎? – nikolas

+0

日期和時間是什麼格式? –

+0

嗨,我似乎得到它的UTC正確,但我不能發佈答案! – nikolas