2012-10-08 104 views
0

我想使用time_t current_time = time(NULL)在C中獲取當前時間。據我所知,它會返回我係統的當前時間。 我稍後嘗試使用struct tm* gmt = gmtime(&current_time)將其轉換爲GMT時間。時間(NULL)返回不同的時間

我使用ctime()asctime()函數打印兩次。

我係統上的當前時間是GMT + 1。但是gmtime()會返回我與current_time相同的時間。我不明白爲什麼gmtime()同時返回我。任何幫助將不勝感激。

確定這裏是代碼和輸出:當前窗口顯示的時間是17:54(斯德哥爾摩區; GMT + 1)。我想讓我回到15:54。或者,也許我的理解是錯誤的...

time_t current_time = time(NULL); 

struct tm* gmt = gmtime(&current_time); 
struct tm* loc = localtime(&current_time); 

printf("current time: %s\n", ctime(&current_time)); 
printf("gmt time %s\n", asctime(gmt)); 
printf("local time %s\n", asctime(loc)); 

輸出:

current time: Mon Oct 8 17:54:06 2012 

gmt time Mon Oct 8 17:54:06 2012 

local time Mon Oct 8 17:54:06 2012 

接受的解決方案:從西門斯

這可能是你的問題。檢查你的TZ環境變量的值;如果不存在,它將默認爲GMT。 Cygwin不會從Windows自動獲取時區設置。另請參見localtime returns GMT for windows programs running on cygwin shells

+0

也許系統上的時區配置不正確? – twalberg

+0

嘗試本地時間功能。 –

+0

我檢查了我的系統和GMT + 1的時區(那是什麼窗口說的)。 – ata

回答

1

time_t類型保存一個值,表示自UNIX紀元以來的秒數。 tm類型保存日曆值。

gmtime()只是將系統時間(始終是UTC)從time_t轉換爲tm。這就是爲什麼這些值是相同的。如果您想要表示當地時間(GMT + 1),那就是localtime()的用途。

+0

問題更新 – ata

+0

我很難過。我能想到的唯一的事情就是使用編譯器或類似的東西,但是你所描述的代碼,盡我所見,應該做你期望的。除非它在虛擬機中運行,在這種情況下,這是與此處相關的虛擬機的系統和本地時間設置。 – Simes

+0

我正在使用cygwin(gcc)編譯程序。 – ata

1

time()返回自紀元以來的秒數。 它等於UTC(又名格林威治標準時間)

Epoch在英國格林威治的1.1.1970,00:00:00。

所以其實time()不返回一個時間,而是一個時間區別

+0

UTC不是GMT,他們是2個不同的東西,即使他們幾乎相同的價值,但沒有必要。 – rkosegi

0

運行調試器在這兩條線:在第二行

struct tm* gmt = gmtime(&current_time); 

struct tm* loc = localtime(&current_time); 

休息,觀看GMT的成員,當你執行第二行 - 你會看到一些GMT成員更改值。顯然,庫使用了一些靜態內存。因此,在運行第二條之前保存第一條語句的結果