2012-06-28 50 views
6

我想從time_t值中提取小時,分鐘和秒數作爲表示自epoch以來秒數的整數值。如何從time_t中提取小時數?

小時數值不正確。爲什麼?

#include <stdio.h> 
#include <time.h> 

#include <unistd.h> 

int main() 
{ 
    char buf[64]; 

    while (1) { 
     time_t t = time(NULL); 
     struct tm *tmp = gmtime(&t); 

     int h = (t/360) % 24; /* ### My problem. */ 
     int m = (t/60) % 60; 
     int s = t % 60; 

     printf("%02d:%02d:%02d\n", h, m, s); 

     /* For reference, extracts the correct values. */ 
     strftime(buf, sizeof(buf), "%H:%M:%S\n", tmp); 
     puts(buf); 
     sleep(1); 
    } 
} 

輸出(小時應該是10)

06:15:35 
10:15:35 

06:15:36 
10:15:36 

06:15:37 
10:15:37 
+0

「int h =(t/3600)%24; ...」使_assumption_ the time_t是整數秒。雖然這很常見,但它並沒有被C定義爲使用'gmtime()/ localtime()'或'difftime()'作爲可移植代碼。 – chux

回答

5

您對gmtime()電話已經這樣做了,所產生的struct tm具有的所有字段。請參閱the documentation

換句話說,只是

printf("hours is %d\n", tmp->tm_hour); 

我認爲這是正確的方法,因爲它避免了涉及scarily大量手工做轉換的代碼。它以最好的方式這樣做,通過使它成爲其他人的問題(即將其抽象化)。因此,請修正您的代碼,而不是通過添加缺少的0,而是使用gmtime()

也想想時區。

+0

謝謝,但問題是:爲什麼計算不正確。 (我同意使用struct tm雖然是一種更好的方法)。 –

+2

@丹納斯:因爲你分爲:T/360它應該是T/3600(記得60 * 60) – Abhineet

+0

嗯,問題實際上是:「如何從time_t提取小時」(在問題規範中我添加了另一個題)。接受答案,因爲它給我一個很好的理由,爲什麼我應該避免自己做轉換。 –

11
int h = (t/3600) % 24; /* ### Your problem. */ 
+0

Doh,爲什麼我沒有看到那個明顯的? –

+0

我認爲每個人都有時會看到一個bug並且沒有看到它。這通常是我的;) –